【问题标题】:Python regex, match more than one integerPython 正则表达式,匹配多个整数
【发布时间】:2011-07-20 14:34:04
【问题描述】:

下面的代码打印的是空白而不是“11”,我不知道为什么。将[0-9]* 替换为[0-9]{1,2} 会打印“11”。有人可以帮忙吗?

import re
test_string = 'cake_11xlfslijg'
pattern = '.*(?P<order>[0-9]*)'
result = re.compile(pattern).search(test_string)
if result:
    print 'result'
    print result.group('order')
else:
    print result

【问题讨论】:

  • [0-9]{1,2} 替换[0-9]* 打印1,而不是11

标签: python regex


【解决方案1】:

你的正则表达式应该是这样的

pattern = '(?P<order>[0-9]+)'
  1. 删除了第一个 .*,因为它会对整个字符串进行贪婪匹配。
  2. 设为 [0-9]+,因为即使存在至少一个数字,它也只会匹配数字,否则它将返回 None。

【讨论】:

    【解决方案2】:

    试试[0-9]+* 转换为“零个或多个”,并且字符串开头有零个或多个数字。

    【讨论】:

    • 快速显示这个的方法:re.search('(.*)(\d*)', 'cake11').groups()
    • 这仍然只匹配1,而不是11,因为正则表达式引擎只在需要时回溯。
    • @Tim 哦,我现在才看到.*(这就是为什么我还写了“在字符串的开头”而不是“在结尾”)。你当然是对的。正则表达式应该是 (?P&lt;order&gt;[0-9]+) 没有 .*
    【解决方案3】:

    因为* 表示:任意次数的重复,在您的正则表达式中.* 将匹配所有字符串,因为. 表示任何字符,即包括[0-9]

    【讨论】:

      【解决方案4】:

      一个正则表达式模式需要有最少的锚点。

      使用 '.' 和 '[0-9]' ,只有可选符号。

      试试

      import re
      
      for test_string in ( 'cake_11xlfslijg',
                           'cake_uuxlfslijg'):
          pattern = '.*?(?P<order>[0-9]+)'
          result = re.compile(pattern).search(test_string)
          print test_string
          print 'result: ',repr(result.group('order')) if result else result
          print
      

      给予

      cake_11xlfslijg
      result:  '11'
      
      cake_uuxlfslijg
      result:  None
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        相关资源
        最近更新 更多