Проблема разделения группы захвата регулярных выражений в Python - PullRequest
0 голосов
/ 29 января 2019

Попытка понять пример регулярного выражения в python, и вот мой код

line='bar asdfgh klmn,     foo'
print(re.split(r'(;|,|\s)\s*',line))
#output is ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', 'foo']

В выводе он показывает строки и разделители, последний разделитель - это запятая с пятью пробелами, а не просто запятая

Если разделитель был просто запятой, разве вывод не должен быть таким?

#output ['bar', ' ', 'asdfgh', ' ', 'klmn', ',', '     foo']

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Если в регулярном выражении используются группы захвата, тогда re.split включает содержимое захваченных групп.Тем не менее, он по-прежнему использует все совпадение в качестве разделителя, что приводит к наблюдаемому вами поведению.Если вы хотите, чтобы "".join(split_results) был равен исходной строке, вам нужно захватить весь разделитель (и использовать не захватывающие паренсы там, где у вас есть парены: r'((?:;|,|\s)\s*)').

0 голосов
/ 29 января 2019

Я бы порекомендовал разделить на следующем шаблоне:

\s*[,;]?\s+

Это говорит о разделении на необязательный пробел и разделитель запятой или точки с запятой, за которым следует один или несколько пробелов.

line='bar asdfgh klmn,     foo'
print(re.split(r'\s*[,;]?\s+', line))

['bar', 'asdfgh', 'klmn', 'foo']

Проблема с вашим текущим шаблоном в том, что он оставляет пространство необязательным, если присутствует разделитель запятой / точки с запятой.Это приводит к тому, что пробелы отображаются как совпадающие термины.

0 голосов
/ 29 января 2019

re.split разбивает предоставленную строку по шаблону, возвращая то, что вы записали в скобки как часть результатов.

В этом случае ваше регулярное выражение соответствует "точка с запятой", запятая или символ пробела (который захватывается и возвращается), за которым следуют 0 или более символов пробела (которые отбрасываются) ".В результате пробел после запятой в вашем примере используется, когда запятая совпадает и не присутствует в вашем выводе.

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