【问题标题】:Python Regular Expression MULTILINE Not Finding Anything [duplicate]Python正则表达式MULTILINE没有找到任何东西[重复]
【发布时间】:2013-08-17 11:38:40
【问题描述】:

我有一个类似

的字符串
line = "... ... constant0 username@domain\r"

我需要提取域名

matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)

matchObj 总是返回None。我在这里错过了什么?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    re.match 只匹配字符串的开头。 re.search 匹配任何地方。根据docs,不要只是在re.match的开头添加.*,使用re.search进行优化! (re.search 在 c 中快速循环,只检查与第一个字符匹配的字符串部分。如果它以不明确的字符开头,它必须一直走到字符串的末尾并回溯。)

    here 是对 Python 的大部分正则表达式功能的更温和(我认为)通常更好的介绍。

    【讨论】:

      【解决方案2】:

      来自re.match 上的文档:

      请注意,即使在MULTILINE 模式下,re.match() 也只会匹配字符串的开头,而不是每行的开头。

      如果您想在字符串中的任意位置找到匹配项,请改用search()(另请参阅search() vs. match())。

      re.match() 不会在字符串中的任何位置找到匹配项,而re.search() 会。您将需要使用re.search()(大部分时间)。

      观察:

      >>> import re
      >>> line = "... ... constant0 username@domain\r"
      >>> matchObj = re.match( 'constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
      >>> matchObj # None
      >>> matchObj = re.search('constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I)
      >>> matchObj
      <_sre.SRE_Match object at 0x10ce84470>
      >>> print matchObj.group(0)
      constant0 username@domain
      >>> print matchObj.group(1)
      username
      

      【讨论】:

        【解决方案3】:

        使用re.search 而不是re.matchre.match 用于匹配字符串的开头。

        search() vs. match():

        Python 提供了两种不同的基于常规的原始操作 表达式:re.match() 仅在 开始 处检查匹配项 字符串,而re.search() 检查匹配 anywhere 在 字符串(这是 Perl 默认所做的)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-04
          • 2020-10-13
          • 1970-01-01
          • 2021-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多