Python RE,AttributeError:'tuple'对象没有属性'group'

时间:2012-03-24 05:04:29

标签: python regex python-2.7

我正在尝试使用Python 2.7正则表达式从我正在学习的课程中提供的示例网页中检索数据。我试图开始工作的代码是:

email_patterns = ['(?P<lname>[\w+\.]*\w+ *)@(?P<domain> *\w+[\.\w+]*).(?P<tld>com)

for pattern in email_patterns:
        # 'line' is a line of text in a sample web page
        matches = re.findall(pattern,line)
        for m in matches:
            print 'matches=', m
            email = '{}@{}.{}'.format(m.group('lname'), m.group('domain'),m.group('tld')) 

运行此命令会返回以下错误:

email = '{}@{}.{}'.format(m.group('lname'), m.group('domain'), m.group('tld'))
AttributeError: 'tuple' object has no attribute 'group'.

我想使用命名组,因为组的顺序可以根据我匹配的文本而改变。但是,它似乎不起作用,因为编译器不认为'm'是一个Group对象。

这里发生了什么,以及如何通过使用命名组来使其正常工作?

1 个答案:

答案 0 :(得分:2)

你有两个问题。就像Ignacio暗示的那样,你不应该使用正则表达式解析(X)HTML ...正则表达式无法处理复杂性。另一个问题是您使用的是findall()而不是finditer()findall()将匹配作为列表返回...如果是组,则将其作为元组列表返回。

另一方面,

finditer()返回MatchGroup个具有group()方法的对象的迭代器。

来自re的python文档:

  

re.findall(pattern,string,flags = 0)返回字符串中pattern的所有非重叠匹配,作为字符串列表。字符串是   从左到右扫描,并按找到的顺序返回匹配。如果   模式中存在一个或多个组,返回列表   组;如果模式有多个,这将是一个元组列表   组。结果中包含空匹配,除非他们触摸了   另一场比赛的开始。

     

re.finditer(pattern,string,flags = 0)返回一个迭代器让步   RE的所有非重叠匹配上的MatchObject实例   字符串中的模式。字符串从左向右扫描,并匹配   按找到的顺序返回。空匹配包含在   结果,除非他们触及另一场比赛的开始。