【问题标题】:Python RE, AttributeError: 'tuple' object has no attribute 'group'Python RE,AttributeError:“元组”对象没有属性“组”
【发布时间】:2012-03-24 05:04:28
【问题描述】:

我正在尝试使用 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 对象。

这里发生了什么,我怎样才能通过使用命名组使其正常工作?

【问题讨论】:

标签: python regex python-2.7


【解决方案1】:

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

另一方面,finditer() 返回具有group() 方法的MatchGroup 对象的迭代器。

来自re的python文档:

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

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

【讨论】:

  • 这是在其他两个问题之上
  • 可能值得一提的是 BeautifulSoup 或类似的库作为正则表达式的可能解决方案。
  • 谢谢,迈克尔。这很有帮助。我会试试 re.finditer。关于正则表达式是否适合我的场景:事实上,它们是。原因如下:这是侧重于使用 Python 和正则表达式的课程作业的一部分。需要使用 Python 和正则表达式。如果我不使用它们,我将不会获得信用。 :-)
  • @Ussabin 好的。如果您对表达式有任何问题,您可以找到许多正则表达式 online 来验证(匹配)电子邮件地址。大多数都伴随着关于使用正则表达式来完成这样的任务的冗长讨论......其中一些要点可能对在课堂上提出是有效的。 ;)
  • 优秀。感谢您的链接。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 2021-07-30
  • 2013-07-29
  • 2020-08-29
  • 2015-04-22
  • 2019-04-27
  • 1970-01-01
相关资源
最近更新 更多