Python正则表达式 "object has no attribute"

8
我正在整理一份需要更新新内容的页面列表(我们正在切换媒体格式)。在此过程中,我正在编目具有正确新内容的页面。
这是我的基本想法:
1. 遍历文件结构并获取文件列表 2. 对于每个文件,将其读入缓冲区,并使用正则表达式搜索匹配特定标记 3. 如果匹配,则测试另外两个正则表达式匹配 4. 将结果匹配的一个或另一个写入数据库
一切都进行得很顺利,直到第三个正则表达式模式匹配时,出现了以下错误: 'NoneType'对象没有属性'group'。
# only interested in embeded content
pattern = "(<embed .*?</embed>)"

# matches content pointing to our old root
pattern2 = 'data="(http://.*?/media/.*?")'

# matches content pointing to our new root
pattern3 = 'data="(http://.*?/content/.*?")'

matches = re.findall(pattern, filebuffer)
for match in matches:
    if len(match) > 0:

    urla = re.search(pattern2, match)
    if urla.group(1) is not None:
        print filename, urla.group(1)

    urlb = re.search(pattern3, match)
    if urlb.group(1) is not None:
        print filename, urlb.group(1)

谢谢你。

4个回答

18

你得到的异常表示urla的值为None。由于urla的值是通过re.search调用确定的,因此可以得出re.search返回了None。这种情况发生在字符串不匹配模式时。

所以基本上你应该使用:

urla = re.search(pattern2, match)
if urla is not None:
    print filename, urla.group(1)

而不是您现在拥有的内容。


3

TypeError的原因是searchmatch通常会返回一个MatchObjectNone。只有MatchObject有一个group方法,而None没有。所以你需要这样做:

url = re.search(pattern2, match)
if url is not None:
    print(filename, url.group(0))
P.S. PEP-8 建议使用 4 个空格进行缩进。这不仅是一种观点,也是一种良好的实践。你的代码相当难以阅读。

啊,谢谢。我在代码中使用制表符,但是这个网站的格式化引擎对其进行了重新格式化/重新解释。"url不为None已经修复了它" - ives

2

我遇到了同样的问题。

使用Python2.6,可以按照以下方式解决:

for match in matches:
    if len(match) > 0:
urla = re.search(pattern2, match) try: print filename, urla.group(1) except AttributeError: print "在pattern2中出现了问题"
urlb = re.search(pattern3, match) try: print filename, urlb.group(1) except AttributeError: print "在pattern3中出现了问题"

小错误:在 urla 块中,except 拼写错误,应为"except:"。 - Jean-Francois T.

0
请注意您的错误假设是在第三次匹配中出现了错误,实际上是在第二次匹配中出现了错误。这似乎导致了错误的假设,即第二次匹配正在执行某些使第三次匹配无效的操作,将您带到了错误的轨道上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接