Python регулярное выражение для определения двух последовательных слов с большой буквы в начале строки - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть этот фрагмент текста, из которого я хочу удалить оба вхождения каждого из имен, «Remggrehte Sertrro» и «Perrhhfson Forr tdd». Я попытался применить это регулярное выражение: ([A-Z][a-z]+(?=\s[A-Z])(?:\s[A-Z][a-z]+)+), но оно идентифицирует «Remggrehte Sertrro We», «Perrhhfson Forr tdd If», а также «Ma sh Mu sh», которое находится внутри текста. По сути, я хочу, чтобы он идентифицировал только первые два заглавных слова в начале строки, не касаясь остальных. Я не эксперт по регулярным выражениям, и я не уверен, как его адаптировать.

Это текст:

Remggrehte Sertrro

Remggrehte Sertrro Мы действительно хотели 4-дневную работу неделя в течение многих лет.

Perrhhfson Forr tdd

Perrhhfson Forr tdd Если у drumph не будет достаточных испытаний и средств индивидуальной защиты, экономия Ma sh Mu sh будет продолжать.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Вы можете использовать этот шаблон /^([A-Z]+.*? ){2}/m, если вы всегда уверены, что получаете только два термина с заглавными буквами и всегда в первых двух терминах в строке. Пример работы на regex101.com

0 голосов
/ 13 апреля 2020

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

В вашем паттерне эта часть (?=\s[A-Z]) может быть опущена при первом утверждении, а затем при прямом сопоставлении.


Можно сопоставить первые 2 слова без группы захвата и установить границу пробела (?!\S) справа

^[A-Z][a-z]+[^\S\r\n][A-Z][a-z]+(?!\S)

Объяснение

  • ^ Начало строки
  • [A-Z][a-z]+ Соответствует символу AZ и 1+ символам нижнего регистра az
  • [^\S\r\n] Соответствует символу пробела за исключением новой строки, поскольку \s может также соответствует новая строка, и вы хотите сопоставить два последовательных заглавных слова в начале строки
  • [A-Z][a-z]+ Соответствует символам AZ и 1+ строчным символам az
  • (?!\S) Утвердить пробел граница справа

Regex demo

Примечание , что [A-Z][a-z]+ соответствует только символам az. Чтобы сопоставить символы слова, вы можете использовать \w вместо [a-z].

0 голосов
/ 13 апреля 2020

Вы можете удалить строку, содержащую только имена, используя флаг re.MULTILINE и следующее регулярное выражение: r"^(?:[A-Z]\w+\s+[A-Z]\w+\s+)$". Это регулярное выражение будет соответствовать каждому имени, только если оно помещается в строку без лишнего текста.

Вот демоверсия:

import re

text = """\
Remggrehte Sertrro

Remggrehte Sertrro We did want a 4-day work week for years.

Perrhhfson Forrtdd

Perrhhfson Forrtdd If drumph does n't get sufficient testing and PPE gear , the economy Mash Mush will continue to.
"""

print(re.sub(r"^(?:[A-Z]\w+\s+[A-Z]\w+\s+)$", "", text, flags=re.MULTILINE))

Вы получаете:


Remggrehte Sertrro We did want a 4-day work week for years.


Perrhhfson Forrtdd If drumph does n't get sufficient testing and PPE gear , the economy Mash Mush will continue to.

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