Захват текста внутри ключевых слов с использованием регулярного выражения - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь захватить несколько строк, которые находятся между специальным ключевым словом и разделены символами новой строки.

text = """
KeyWord some text
Data: 012
***coconut***
list[123]
par(098)
Finish me


KeyWord random random text
Data: 1257
Cowboy
***mango***
list[121343]
par(afsd)
Catwoman
Tamarindo
Gotic
Gotham




KeyWord another text
Data: 532
***banana***
It can have more lines
And more
And more
list[dhf]
par(345)


"""

Как видите, каждый «абзац» начинается с KeyWord и имеет другое число линий. Я хочу захватить каждый абзац, разделенный n пустыми строками, и поместить их в список, чтобы позже я мог выполнять итерацию по списку, который должен содержать только строки с текстом (абзацы). Длина окончательного списка должна быть 3. И не должна содержать пустых строк, только строки с символами.

Я попробовал следующее безуспешно:

pattern = re.compile(r'KeyWord .+KeyWord',re.DOTALL)

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Я бы использовал re.findall здесь:

paragraphs = re.findall(r'\bKeyWord(.*?)(?=\bKeyWord\b|$)', text, flags=re.DOTALL)
print(paragraphs)

Это печатает:

[' some text\nData: 012\n***coconut***\nlist[123]\npar(098)\nFinish me\n\n\n',
 ' random random text\nData: 1257\nCowboy\n***mango***\nlist[121343]\npar(afsd)\nCatwoman\nTamarindo\nGotic\nGotham\n\n\n\n\n',
 ' another text\nData: 532\n***banana***\nIt can have more lines\nAnd more\nAnd more\nlist[dhf]\npar(345)\n\n']

Логическое выражение regex c здесь, чтобы захватить то, что следует за ключевым словом до, но включая появление следующего ключевого слова или конца ввода.

0 голосов
/ 27 марта 2020

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

Если KeyWord всегда находится в начале строки, вы можете использовать якорь ^ и re.MULTILINE

^KeyWord\b.*(?:\r?\n(?!KeyWord\b).*)*

Объяснение

  • ^KeyWord\b Начало строки, совпадение ключевого слова и границы слова
  • .* Совпадение 0+ раз любой символ, кроме новой строки
  • (?: Группа без захвата
    • \r?\n Соответствует новой строке
  • (?!KeyWord\b).* Утверждение того, что непосредственно право не является ключевым словом и соответствует всей строке
  • )* Закрыть группу и повторить 0+ раз

Regex demo | Python демо

Пример кода

result = re.findall(r"^KeyWord\b.*(?:\r?\n(?!KeyWord\b).*)*", text, re.MULTILINE)
print(result)
print(len(result))

Выход

['KeyWord some text\nData: 012\n***coconut***\nlist[123]\npar(098)\nFinish me\n\n', 'KeyWord random random text\nData: 1257\nCowboy\n***mango***\nlist[121343]\npar(afsd)\nCatwoman\nTamarindo\nGotic\nGotham\n\n\n\n', 'KeyWord another text\nData: 532\n***banana***\nIt can have more lines\nAnd more\nAnd more\nlist[dhf]\npar(345)\n\n\n']
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...