Извлечение из строки перед определенным шаблоном - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь вырезать статьи из немецкой википедии, чтобы выводить только биографические текстовые данные (вырезать всю литературу, списки книг и т. Д.). Таким образом, пример текста может выглядеть так:

некоторый соответствующий текст == Title1 == более соответствующий текст === Title2 === и более актуальный текст == немного литературы о человеке == нежелательный текст == книги автора == больше нежелательного текста ...

Проблема заключается в выводе текста перед шаблоном == [текст, включающий слово литература или книги] ==. Вот это было бы:

некоторый соответствующий текст == Title1 == более соответствующий текст === Title2 === и более актуальный текст

Я использую Python 3, и я попробовал несколько таких регулярных выражений (и многие другие):

seperator = re.compile(r'={2,3}\s?.*literature.*\s?={2,3}')
m = seperator.search(text)
print (text[:m.start()])

Но, к сожалению, это будет выводить текст только до первого шаблона == Title1 ==:

соответствующий текст

Как я могу сделать его чувствительным, чтобы запечатлеть первый шаблон, в котором есть «литература» или «книга»?

Я надеюсь, что смогу точно описать проблему. Заранее благодарю за помощь и извините, если этот вопрос задавался ранее, я нигде не мог найти решение.

Кстати, нет никакой возможности отличить Title1 от Title2, так как они иногда бывают слишком разными и непонятными, поэтому я попытался различить названия, которые четко обозначают конец биографических текстов, таких как литература или книга, например.

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Если я правильно понимаю ваше требование, следующее регулярное выражение должно работать для вас:

.+?(?=={2,3}[^=]*literature)

Regex demo .

Пример Python 3:

import re

regex = r".+?(?=={2,3}[^=]*literature)"
test_str = "some relevant text == Title1 == more relevant text ===Title2=== and more relevant text == some literature on person == unwanted text ==books by the author== more unwanted text..."

matches = re.finditer(regex, test_str, re.MULTILINE)
for matchNum, match in enumerate(matches, start=1):
    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

Вывод:

Матч 1 был найден в 0-87: некоторый соответствующий текст == Title1 == более релевантный текст === Title2 === и более релевантный текст

Python demo .

1 голос
/ 28 апреля 2019

Вот чистый способ Python. Это разбивает текст на '=' и проверяет наличие слова в каждом разбиении. Если совпадение найдено, мы разрываем цикл и объединяем все до него:

s = 'some relevant text == Title1 == more relevant text ===Title2=== and more relevant text == some literature on person == unwanted text ==books by the author== more unwanted text'

lst = []
for x in s.split('='):
    if 'literature' in x:
        break
    else:
        lst.append(x)

print('='.join(lst).strip('='))
# some relevant text == Title1 == more relevant text ===Title2=== and more relevant text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...