Почему вывод re.split ('(\ d)', 'SPL5IT THE WORDS') отличается от re.split ('\ d', 'SPL5IT THE WORDS') в регулярном выражении в python? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть вопрос по поводу регулярных выражений в Python.Я попытался распечатать результат re.split ('(\ d)', 'SPL5IT THE WORDS') и re.split ('\ d', 'SPL5IT THE WORDS').Результат примерно такой:

re.split('\d', 'SPL5IT THE WORDS')
Out[20]: ['SPL', 'IT THE WORDS']

re.split('(\d)', 'SPL5IT THE WORDS')
Out[21]: ['SPL', '5', 'IT THE WORDS']

Почему второй вернет разделитель, а первый - нет?

1 Ответ

0 голосов
/ 17 октября 2018

Поскольку именно это задокументировано для выполнения в первых двух строчках документации (выделение добавлено):

Разделение string по вхождениям pattern. Если в pattern используются захватывающие скобки, то текст всех групп в шаблоне также возвращается как часть полученного списка.

«почему» дляСама особенность заключается в том, что иногда вы хотите, чтобы знали, что вы захватили, особенно при использовании более сложного шаблона, который может соответствовать всем видам вещей, и вам может потребоваться настроить код в зависимости от последовательности разбиения.

В самом простом примере, если вы хотите изменить определенные слова в предложении (достаточно сложным образом, чтобы re.sub не был разумным вариантом), затем восстановите предложение точно таким, каким оно было,но с новыми словами, разделенными на неалфавитные символы или пробелами без пробелов, невозможно было бы восстановить форму исходного предложения;даже без изменения слов, используя простой str.split для пробелов и просто предполагая, что это одиночные пробелы, ' '.join('a\tb\nc d\re'.split()) вернет 'a b c d e';в тот момент, когда вы разделитесь без захвата, вы потеряете данные.В отличие от этого, ''.join(re.split(r'(\s+)', 'a\tb\nc d\re')) не имеет потерь.

Если вам нужно сгруппировать без захвата, используйте не захватывающие группы вида (?:PAT) вместо захвата, (PAT).

...