Regex в Python: не может совпадать с повторяющимися номерами групп - PullRequest
0 голосов
/ 05 декабря 2018

Я использую регулярное выражение для обнаружения чисел от 0 до 999 999 999 внутри строки в Python.

import re

test_string = "b\'[<span id=\"prl\">114 893</span>]\'"

working_pattern = "\d{1,3}\s\d{3}"
non_working_pattern = "\d{1,3}(\s\d{3}){0,2}"

wk_ptrn = re.findall(working_pattern, test_string)
non_wk_ptrn = re.findall(non_working_pattern, test_string)

print(wk_ptrn)
print(non_wk_ptrn)

Результаты:

print(wk_ptrn) отображает: ['114 893']
print(non_wk_ptrn) отображает: [' 893'] (с пробелом перед первой цифрой)

Non_working_pattern: "\d{1,3}(\s\d{3}){0,2}"

\d{1,3} :

обнаруживает от 1 до 3 цифр [0до 999]

\s\d{3} : 

обнаруживает любой пробел, за которым следуют 3 цифры ["000" до "999"]

{0,2} : 

- это квантификатор, поэтому я могу обнаружить "0" (quantifier = 0) до "999[ 999][ 999]" (quantifier = 2).

Я не понимаю, почему "\d{1,3}(\s\d{3}){0,2} "не работает.
Не могли бы вы помочь мне разобраться в ошибке?

Спасибо. С уважением.

1 Ответ

0 голосов
/ 05 декабря 2018

Вы почти на месте, но вы должны изменить его следующим образом:

pattern = "\d{1,3}(?:\s\d{3}){0,2}"

* * * * * * * * * * * * * * * * * * * * * * * * * '100' * делает группу не захватывающей, так что findall вернет всеспички, а не только группы.Как указано в связанных документах:

Если в шаблоне присутствует одна или несколько групп, вернуть список групп

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