我试图用正则表达式过滤字符串列表,如本答案所示.但是代码会产生意外结果:
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']
.
问题是你的模式包含*
,quantier,将匹配零个或多个数字.因此,即使字符串根本不包含数字,它也会匹配模式.此外,您的模式将匹配输入字符串中出现的位数,这意味着,a2
它仍然是有效匹配,因为它包含一个数字.
尝试使用此模式
^[0-9]+$
或者更简单:
^\d+$
这将匹配一个或多个数字.start(^
)和end($
)锚点确保字符串中不允许其他字符.
这里真的需要正则表达式吗?你有str.isdigit
:
>>> string_list = ['123', 'a', '467','a2_2','322','21'] >>> [x for x in string_list if x.isdigit()] ['123', '467', '322', '21'] >>>