Python正则表达式:匹配多个整数

4
下面的代码打印的是空格而不是“11”,我搞不清楚为什么。用[0-9]{1,2}替换[0-9]*可以打印出“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]*替换为[0-9]{1,2}会打印出1,而不是11 - Tim Pietzcker
4个回答

11
尝试使用[0-9]+*可翻译为"零个或多个",而在您的字符串开头右侧有零个或多个数字。

快速展示方法:re.search('(.)(\d)', 'cake11').groups() - jtniehof
1
这仍然只匹配1,而不是11,因为正则表达式引擎只回溯到必要的程度。 - Tim Pietzcker
@Tim 哦,我现在才看到 .*(这就是为什么我写“在字符串开头”而不是“在结尾”)。当然你是对的。正则表达式应该是 (?P<order>[0-9]+) 而不带有 .* - Tomalak

6
你的正则表达式应该是这个:

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

pattern = '(?P<order>[0-9]+)'
  1. 将第一个 .* 移除,因为它会贪婪地匹配整个字符串。
  2. 将 [0-9]+ 设为匹配数字,即使只有一个数字也可以匹配,否则将返回 None。

1

因为 * 的意思是:重复任意次数,在你的正则表达式中,.* 将匹配整个字符串,因为 . 表示任意字符,包括 [0-9]


0

正则表达式模式需要至少有锚点。

使用'.'和'[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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接