Группировка без создания новых целей для re.findall () - PullRequest
1 голос
/ 30 июня 2019

Я хотел бы обобщить этот вопрос Есть ли способ группировки элементов, который не увеличивает кортежи re.findall ()?

Мой пример:

line="(1 (2 (1 (1 (1 (2 You) (1 (2 (2 wo) (2 n't)) (2 (2 like) (2 Roger)))) (2 ,)) (2 but)) (2 (2 you) (3 (3 (2 will) (2 quickly)) (2 (2 recognize) (2 him))))) (2 .))\n"
numR=re.compile(r"\({1}(\d)? ((')*\w+|('|\.|,))\){1}")
re.findall(numR,line)
[('2', 'You', '', ''),
 ('2', 'wo', '', ''),
 ('2', 'like', '', ''),
 ('2', 'Roger', '', ''),
 ('2', ',', '', ','),
 ('2', 'but', '', ''),
 ('2', 'you', '', ''),
 ('2', 'will', '', ''),
 ('2', 'quickly', '', ''),
 ('2', 'recognize', '', ''),
 ('2', 'him', '', ''),
 ('2', '.', '', '.')]

Как видите, кортеж содержит 2 ненужных элемента в конце

1 Ответ

3 голосов
/ 30 июня 2019

В вашем паттерне у вас есть 4 группы захвата. Вы можете использовать одно чередование во второй группе захвата, имеющей всего 2 группы захвата.

\((\d) ([.',]|\w+)\)

Объяснение

  • \( Совпадение (
  • (\d) Группа 1, захватить одну цифру (используйте \d+ для 1+ цифр)
  • ( Группа 2
    • [.',]|\w+ Совпадение с одним из перечисленных в классе символов ИЛИ мат 1+ символов слова
  • ) Закрыть группу 2
  • \)

Regex demo | Python demo

import re
line="(1 (2 (1 (1 (1 (2 You) (1 (2 (2 wo) (2 n't)) (2 (2 like) (2 Roger)))) (2 ,)) (2 but)) (2 (2 you) (3 (3 (2 will) (2 quickly)) (2 (2 recognize) (2 him))))) (2 .))\n"
numR=re.compile(r"\((\d) ([.',]|\w+)\)")
print(re.findall(numR,line))

Результат

[('2', 'You'), ('2', 'wo'), ('2', 'like'), ('2', 'Roger'), ('2', ','), ('2', 'but'), ('2', 'you'), ('2', 'will'), ('2', 'quickly'), ('2', 'recognize'), ('2', 'him'), ('2', '.')]

Обратите внимание, что вы можете опустить {1}, а чередование ('|\.|,) можно записать с использованием класса символов [.',]

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