我正在尝试使用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对象。
这里发生了什么,以及如何通过使用命名组来使其正常工作?
答案 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实例 字符串中的模式。字符串从左向右扫描,并匹配 按找到的顺序返回。空匹配包含在 结果,除非他们触及另一场比赛的开始。