Регулярное выражение Python для совпадения целого числа в виде строки

Я пытаюсь отфильтровать список строк с регулярными выражениями, как показано в этом ответе. Однако код дает неожиданный результат:

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'].

Ответы

Ответ 1

Проблема заключается в том, что ваш шаблон содержит *, quantifier, будет соответствовать нулю или более цифрам. Поэтому, даже если строка не содержит цифры вообще, она будет соответствовать шаблону. Кроме того, ваш шаблон будет соответствовать цифрам, где бы они ни находились во входной строке, то есть a2 по-прежнему является допустимым, потому что он содержит цифру.

Попробуйте использовать этот шаблон

^[0-9]+$

Или проще:

^\d+$

Это будет соответствовать одной или нескольким цифрам. Ярлыки start (^) и end ($) гарантируют, что никакие другие символы не будут разрешены внутри строки.

Ответ 2

Есть ли необходимость в 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']
>>>