使用Python正则表达式匹配一个整数字符串

17

我正在尝试使用正则表达式过滤字符串列表,就像这个答案中所示。然而代码给出了意外的结果:

In [123]: r = re.compile('[0-9]*')
In [124]: string_list = ['123', 'a', '467','a2_2','322','21']
In [125]: filter(r.match, string_list)
Out[125]: ['123', 'a', '467', 'a2_2', '322_2', '21']

我期望的输出结果是['123','467','21']

2个回答

18
问题在于您的模式包含量词*,将匹配零个或更多数字。因此,即使字符串根本不包含数字,它也会匹配模式。此外,您的模式将在输入字符串中出现数字的任何位置进行匹配,这意味着a2仍然是一个有效的匹配,因为它包含一个数字。
尝试使用此模式
^[0-9]+$
更简单地说:
^\d+$

这将匹配一个或多个数字。起始锚点 (^) 和结束锚点 ($) 确保字符串中不允许出现其他的字符。


8

在这里真的需要使用正则表达式吗?你可以使用 str.isdigit

>>> string_list = ['123', 'a', '467','a2_2','322','21']
>>> [x for x in string_list if x.isdigit()]
['123', '467', '322', '21']
>>>

在这个特定的例子中,没有,但我想知道为什么它没有按照我预期的方式工作。 - Mike Vella
2
如果我们输入 1e6,会发生什么呢? :) - user1467267
@Allendar >>> '23e1'.isdigit()False - Mike Vella
1
@Allendar - 是的,那会失败。 :) 然而,根据他最初的正则表达式模式,看起来OP没有那样的数字。 - user2555451
1
听起来合理。我想看到不同的解决方法也是很好的变化 :)。顺便说一下,1e6 在 Python 2 和 3 中似乎都返回一个浮点数。 - user1467267
我对Python中“digit”的定义有些困惑。在我的理解中,“23”实际上是两个数字,因此"23".isdigit()应该为false。我只期望匹配模式^[0-9]$的字符串才为true。 - vlad_tepesch

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