Я пытаюсь сопоставить строку с 5-значным коды купонов распространяются по всей веб-странице HTML. Например, 53232
, 21032
, 40021
и т. Д. .. Я могу обработать более простой случай любой строки из 5 цифр с помощью [0-9] {5}
, хотя это также соответствует 6, 7, 8 ... n цифрам. Может кто-нибудь предложить, как бы я изменил это регулярное выражение, чтобы оно соответствовало только пятизначным числам?
>>> 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+" ")
Очень простой способ - сопоставить все группы цифр, например, r '\ d +'
, а затем пропустить каждое совпадение длиной не пять символов, когда вы обрабатываете результаты.
полная строка: ^ [0-9] {5} $
внутри строки: [^ 0-9] [0-9] {5} [^ 0-9]
Вы можете попробовать
\D\d{5}\D
или, может быть,
\b\d{5}\b
Я не уверен, как python обрабатывает там окончания строк и пробелы.
Я считаю, что ^ \ d {5} $
не подойдет вам, так как вы, вероятно, захотите получить числа, которые находятся где-то в другом тексте.
Вероятно, вы захотите сопоставить нецифровую строку до и после вашей строки из 5 цифр, например [^ 0-9] ([0-9] {5}) [^ 0-9]
. Затем вы можете захватить внутреннюю группу (фактическую строку, которую хотите).
Без дополнения строки для особого случая начала и конца строки, как в ответ Джона Ла Роя , можно использовать обратный просмотр вперед и назад для обработки обоих случаев с помощью одного регулярное выражение
>>> import re
>>> s = "88888 999999 3333 aaa 12345 hfsjkq 98765"
>>> re.findall(r"(?<!\d)\d{5}(?!\d)", s)
['88888', '12345', '98765']