【问题标题】:finding email address in a web page using regular expression使用正则表达式在网页中查找电子邮件地址
【发布时间】:2013-08-09 19:25:57
【问题描述】:

我是 Python 的初学者。这是我必须从网页中查找电子邮件地址实例的代码。

    page = urllib.request.urlopen("http://website/category")
    reg_ex = re.compile(r'[-a-z0-9._]+@([-a-z0-9]+)(\.[-a-z0-9]+)+', re.IGNORECASE
    m = reg_ex.search_all(page)
    m.group()

我跑的时候,Python模块说语法无效,就行了:

    m = reg_ex.search_all(page)

谁能告诉我为什么它无效?

【问题讨论】:

    标签: python regex search webpage


    【解决方案1】:

    考虑一个替代方案:

    ## Suppose we have a text with many email addresses
    str = 'purple alice@google.com, blah monkey bob@abc.com blah dishwasher'
    
    ## Here re.findall() returns a list of all the found email strings
    emails = re.findall(r'[\w\.-]+@[\w\.-]+', str) 
        ## ['alice@google.com', 'bob@abc.com']    
    for email in emails:
        # do something with each found email string
        print email
    

    来源:https://developers.google.com/edu/python/regular-expressions

    【讨论】:

    • 这可能是 OP 正在寻找的解决方案,但它没有回答他的问题......
    • 因此,如果 OP 询问他试图在哪里获得某个输出并询问为什么他的代码不起作用,我只应该告诉他为什么他的代码不起作用而不是给他一个更好的解决方案?
    • 不,两者都做。解释为什么他不起作用,然后提供解决方案并解释它为什么起作用。
    • 解释了4次为什么他的不起作用,所以我不想多余。
    • 这个正则表达式也可以匹配无效的电子邮件,如 name@example 没有 ltd 扩展名。
    【解决方案2】:

    此外,reg_ex 没有 search_all 方法。你应该传入page.read()

    【讨论】:

      【解决方案3】:

      您没有在此行关闭 )

      reg_ex = re.compile(r'[a-z0-9._]+@([-a-z0-9]+)(\.[-a-z0-9]+)+', re.IGNORECASE)
      

      另外,您的正则表达式无效,请尝试以下操作:

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

      仅供参考,使用正则表达式验证电子邮件并非易事,请参阅以下主题:

      【讨论】:

      • 您建议的正则表达式在这个用例中没有意义。 OP 想在一堆文本中找到一个电子邮件地址,所以这里的锚点是错误的。
      • @stema 好的,这只是一个示例,但正确,无需设置界限。
      【解决方案4】:

      re 模块没有.search_all 方法

      也许你要找的是.findall

      你可以试试

      re.findall(r"(\w(?:[-.+]?\w+)+\@(?:[a-zA-Z0-9](?:[-+]?\w+)*\.)+[a-zA-Z]{2,})", text)
      

      我假设 text 是要搜索的文本,在你的情况下应该是 text = page.read()

      或者你需要编译正则表达式:

      r = re.compile(r"(\w(?:[-.+]?\w+)+\@(?:[a-z0-9](?:[-+]?\w+)*\.)+[a-z]{2,})", re.I)
      results = r.findall(text)
      

      注意: .findall 返回匹配列表

      如果需要迭代获取匹配对象,可以使用.finditer

      (来自之前的示例)

      r = re.compile(r"(\w(?:[-.+]?\w+)+\@(?:[a-z0-9](?:[-+]?\w+)*\.)+[a-z]{2,})", re.I)
      for email_match in r.finditer(text):
          email_addr = email_match.group() #or anything you need for a matched object
      

      现在的问题是你必须使用什么正则表达式:)

      【讨论】:

        【解决方案5】:

        r'[-a-z0-9._]+@([-a-z0-9]+)(\.[-a-z0-9]+)+' 更改为r'[aA-zZ0-9._]+@([aA-zZ0-9]+)(\.[aA-zZ0-9]+)+'a-z 之前的- 字符是原因

        【讨论】:

          猜你喜欢
          • 2011-08-03
          • 1970-01-01
          • 2011-12-28
          • 1970-01-01
          • 2014-12-26
          • 2012-02-23
          • 2013-04-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多