Как найти строку и N слов после и перед ней в списке текста и

#python #regex

Вопрос:

У меня есть список, включающий текст документов. Я собираюсь найти специальное слово в каждом документе, а затем извлечь 20 слов после и до строки. Наконец, запишите каждое открытие в фрейм данных. Я знаю, что должен использовать регулярное выражение, но я не знаю, как я должен считать до и после нахождения слова. И как я должен настроить код, чтобы продолжить поиск остальной части текста.

Комментарии:

1. И что вы сделали до сих пор?

2. Я предполагаю, что код, который вы написали до сих пор, не работает. Пожалуйста, покажите это, и кто-нибудь, несомненно, поможет вам понять, где вы, возможно, ошиблись

Ответ №1:

Вот решение с использованием регулярного выражения. Я сопоставляю слово in и 3 слова до/после (только 3 для ясности):

 re.findall(r'(?:bS s*){,3}binb(?:s*S s*?){,3}', text)
 

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

ввод текста:

 text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.'
 

выход:

 ['scelerisque vitae, consequat in, pretium a,',
 'Pellentesque congue. Ut in risus volutpat libero',
 'Praesent egestas leo in pede. Praesent blandit',
 'ante ipsum primis in faucibus orci luctus']
 

сопоставление нескольких слов:

Пример с sed / orci :

 re.findall(r'(?:bS s*){,3}b(?:sed|orci)b(?:s*S s*?){,3}', text)
 

выход:

 ['adipiscing nec, ultricies sed, dolor. Cras',
 'mi. Proin porttitor, orci nec nonummy molestie,',
 'eu enim. Pellentesque sed dui ut augue',
 'primis in faucibus orci luctus et ultrices',
 'Mauris ac mauris sed pede pellentesque fermentum.']
 

выход:

Комментарии:

1. Большое спасибо за вашу помощь

2. $ соответствует концу строки, поэтому вы не можете объединить ее с тем, что хотите сделать, если цель состоит только в том, чтобы сопоставить разные слова, которые вы можете сделать wordA|wordB . Я обновлю ответ

3. Я буду искать «сотрудничество*» в каждом тексте. Я имею в виду, что я буду искать «сотрудничество», «сотрудничество»,»сотрудничество», «сотрудничество». Не могли бы вы, пожалуйста, помочь мне изменить шаблон?

4. collaboratw* должно сработать

Ответ №2:

Вы можете использовать метод поиска, а затем вырезать текст. Это дало бы что-то вроде этого:

 to_extract = ""
pos = txt.find(TO_FIND)
if pos != -1:
    if pos > 20 and pos   20 < len(txt):
        to_extract = txt[pos-20:pos 20]
    elif pos < 20:
        to_extract = txt[:pos 20]
    elif pos   20 > len(txt):
        to_extract = txt[pos-20:]
 

nb: Я не проверял это, но это правильный путь, плюс это работает только для первого появления слова