Python正则表达式:问号(?)在字符串中间不匹配

时间:2013-06-04 04:14:01

标签: python regex regex-greedy

我在使用Python时遇到了问题:当我创建一个随机字符串时,假设“test 1981”,下面的Python调用返回一个空字符串。

>>> re.search('\d?', "test 1981").group()
''

我想知道为什么会这样。我正在阅读其他一些帖子,似乎它与贪婪与非贪婪的运营商有关。这是'?'检查第一个值是否为数字,如果不是,则采用更简单,更快速的路径并且只输出任何内容? 任何澄清都会有所帮助。谢谢!

3 个答案:

答案 0 :(得分:3)

您的模式匹配数字或空字符串。它从第一个字符开始并尝试匹配一个数字,它接下来正在尝试匹配替代,意味着空字符串,在第一个字符之前找到匹配。

我认为你希望它继续前进并尝试匹配下一个角色,但是没有完成,首先它会尝试匹配量词在第一个位置上允许的内容。这是0或一位数。

使用可选的量词仅与所需的部分结合使用,比如你想要一个数字后跟一个可选的数字:

>>> re.search('\d\d?', "test 1981").group()
'19'

否则你的模式总是如此。

答案 1 :(得分:1)

正则表达式

\d?

只是意味着它应该(?)匹配单个数字(\d)。

如果你使用这样的东西,它将按你的预期工作(在字符串中的任何地方匹配单个数字):

\d

答案 2 :(得分:1)

re.search('\d?', "test 1981").group()贪婪地匹配它可以找到的模式的第一个匹配(0或1位)。在这种情况下,这是零数字。请注意,re.search('\d?', "1981 test").group()实际上匹配字符串开头的字符串'1'。你在这里寻找的是re.search('\d+', "test 1981").group(),无论它在哪里,它都能找到整个字符串。