Python Регулярные выражения соответствуют всем 5-значным номерам, но не больше.

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

24
задан Bryce Thomas 20 August 2010 в 16:40
поделиться

6 ответов

>>> 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+" ")
40
ответ дан 28 November 2019 в 22:26
поделиться

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

3
ответ дан 28 November 2019 в 22:26
поделиться

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

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

13
ответ дан 28 November 2019 в 22:26
поделиться

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

\D\d{5}\D

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

\b\d{5}\b

Я не уверен, как python обрабатывает там окончания строк и пробелы.

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

1
ответ дан 28 November 2019 в 22:26
поделиться

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

1
ответ дан 28 November 2019 в 22:26
поделиться

Без дополнения строки для особого случая начала и конца строки, как в ответ Джона Ла Роя , можно использовать обратный просмотр вперед и назад для обработки обоих случаев с помощью одного регулярное выражение

>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']
12
ответ дан 28 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: