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