Регулярные выражения Python соответствуют всем 5-значным номерам, но не более - PullRequest
22 голосов
/ 20 августа 2010

Я пытаюсь сопоставить 5-значные коды купонов по всей HTML-странице. Например, 53232, 21032, 40021 и т.д ... Я могу обработать более простой случай любой строки из 5 цифр с помощью [0-9]{5}, хотя это также соответствует 6, 7, 8 ... n цифрам , Может кто-нибудь подсказать, как бы я изменил это регулярное выражение, чтобы оно соответствовало только 5-значным числам?

Ответы [ 7 ]

37 голосов
/ 20 августа 2010
>>> import re
>>> s="four digits 1234 five digits 56789 six digits 012345"
>>> re.findall(r"\D(\d{5})\D", s)
['56789']

если они могут возникнуть в самом начале или в самом конце, проще набить строку, чем связываться с особыми случаями

>>> re.findall(r"\D(\d{5})\D", " "+s+" ")
12 голосов
/ 20 августа 2010

полная строка: ^[0-9]{5}$

внутри строки: [^0-9][0-9]{5}[^0-9]

10 голосов
/ 20 августа 2010

Без дополнения строки для особого случая начала и конца строки, как в John La Rooy ответ, можно использовать негативы lookahead и lookbehind для обработки обоих случаев с помощью одного регулярного выражения

>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']
4 голосов
/ 20 августа 2014

Примечание: Существует проблема при использовании \D, поскольку \D соответствует любому символу, который не является цифрой, вместо этого используйте \b. \b здесь важно, потому что оно соответствует границе слова, но только в конце или начале слова.

import re  

input = "four digits 1234 five digits 56789 six digits 01234,56789,01234"


re.findall(r"\b\d{5}\b", input)  

result : ['56789', '01234', '56789', '01234']

но если использовать re.findall (r "\ D (\ d {5}) \ D", с) вывод: ['56789', '01234'] \ D не может обрабатывать запятую или любые непрерывно вводимые цифры.

\ b важная часть, здесь она соответствует пустой строке, но только в конце или начале слова.

Дополнительная документация: https://docs.python.org/2/library/re.html

Больше разъяснений по использованию \D против \b:

В этом примере используется \D, но он не фиксирует все пять цифр.

В этом примере использует \b при захвате всех пяти цифр.

Приветствия

3 голосов
/ 20 августа 2010

Очень простым способом было бы сопоставить все группы цифр, например, с r'\d+', а затем пропустить каждое совпадение длиной не более пяти символов при обработке результатов.

1 голос
/ 20 августа 2010

Вы можете попробовать

\D\d{5}\D

или, может быть,

\b\d{5}\b

Хотя я не уверен, как Python обрабатывает окончания строк и пробелы.^\d{5}$ не будет работать для вас, так как вы, вероятно, хотите получить числа, которые находятся где-то в другом тексте.

1 голос
/ 20 августа 2010

Возможно, вы хотите сопоставить не-цифру до и после вашей строки из 5 цифр, например [^0-9]([0-9]{5})[^0-9].Затем вы можете захватить внутреннюю группу (нужную вам строку).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...