【问题标题】:REGEX extracting specific part non greedy正则表达式非贪婪地提取特定部分
【发布时间】:2016-09-23 16:35:50
【问题描述】:

我是 Python 2.7 的新手。使用正则表达式,我试图从文本文件中提取来自输入行的电子邮件。我正在使用非贪婪方法,因为电子邮件在同一行中重复了 2 次。这是我的代码:

import re
f_hand = open('mail.txt')
for line in f_hand:
    line.rstrip()
    if re.findall('\S+@\S+?',line): print re.findall('\S+@\S+?',line)

然而,这是我得到的,而不仅仅是电子邮件地址:

['href="mailto:secretary@abc-mediaent.com">sercetary@a']

我应该在re.findall 中使用什么来获取电子邮件?

【问题讨论】:

  • [^@]+@\S+?- 明确匹配非@
  • 不要尝试使用正则表达式解析 HTML。使用 HTML 解析器。
  • 这将有助于查看您尝试解析的文本示例,以及预期的输出。
  • 嗨布伦丹!这是文本:sachin.gokhale@indiacast.com

标签: python regex python-2.7 non-greedy


【解决方案1】:

如果您解析一个简单的文件,其中包含电子邮件地址的锚点并且始终使用相同的语法(例如用双引号将属性括起来),您可以使用:

for line in f_hand: 
    print re.findall(r'href="mailto:([^"@]+@[^"]+)">\1</a>', line)

re.findall 只返回捕获组。\1 代表第一个捕获组的内容。)

如果文件是更复杂的 html 文件,请使用解析器,提取链接并过滤它们。
或者最终使用 XPath,例如:
substring-after(//a/@href[starts-with(., "mailto:")], "mailto:")

【讨论】:

    【解决方案2】:

    \S 表示不是空格。 "&gt; 不是空格。

    您应该使用mailto:([^@]+@[^"]+) 作为正则表达式(引用形式:'mailto:([^@]+@[^"]+)')。这会将电子邮件地址放在第一个捕获组中。

    【讨论】:

      【解决方案3】:

      试试这个 re.findall('mailto:(\S+@\S+?\.\S+)\"',str))

      它应该给你类似的东西 ['secretary@abc-mediaent.com']

      【讨论】:

      • 嗨,Saurabh!这就是我现在得到的: ['mailto: email@email.com" '] 如何删除 mailto 和 " 符号?
      【解决方案4】:

      \S 接受许多在电子邮件地址中无效的字符。尝试正则表达式

      [a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+\\.[a-zA-Z0-9-_.]+
      

      (假设您没有尝试支持 Unicode - 似乎您不是,因为您的输入是“文本文件”)。

      这将需要一个“。”在电子邮件地址的服务器部分中,您的匹配将在电子邮件地址中的第一个无效字符处停止。

      【讨论】:

        【解决方案5】:

        这是电子邮件地址的格式 - https://www.rfc-editor.org/rfc/rfc5322#section-3.4.1

        请记住,您需要的正则表达式是 - r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"(此方法无需依赖电子邮件地址周围的文本即可工作。)

        以下代码行-

        html_str = r'<a href="mailto:sachin.gokhale@indiacast.com">sachin.gokhale@indiacast.com</a>'
        email_regex = r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"
        print re.findall(email_regex, html_str)
        

        产量 -

        ['sachin.gokhale@indiacast.com', 'sachin.gokhale@indiacast.com']
        

        附: - 我通过谷歌搜索“电子邮件地址正则表达式”并点击第一个站点 - http://emailregex.com/

        获得了电子邮件地址的正则表达式

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-16
          • 1970-01-01
          • 1970-01-01
          • 2011-04-27
          • 2010-10-20
          • 2013-02-15
          • 1970-01-01
          相关资源
          最近更新 更多