Вернуть перекрывающиеся строки между совпадениями с помощью регулярного выражения Python3 - PullRequest
0 голосов
/ 09 февраля 2019

Идеальный результат:

Я хотел бы вывести,

[2+ years in buy side research, 2+ years in accounting]

Из приведенной ниже строки, которая является предложением в описании работы,

'2+ years in buy side research or accounting'

Итак, 2+ years in повторяется для обоих совпадений и разбивается на or.

Но я над своей головой пишу сложное регулярное выражение.

В настоящее время результат:

str1 = '2+ years in buy side research or accounting'

pattern = re.compile(r'([0-9+]+ years|year)')

match_object = re.findall(pattern, str1)

=> ['2+ years']

Примечание. Я попытался написать заголовок этого вопроса наиболее понятным способом, но я рад принять изменение, если есть более понятный способ его записи.

1 Ответ

0 голосов
/ 10 февраля 2019

Возможный подход здесь состоит в том, чтобы сопоставить все слова, разделенные пробелами после x years in, а затем любое количество слов, которые следуют после соединения or, и как только совпадения будут получены, сформируйте результирующий список, добавив эти слова к x years in часть.

Обратите внимание, что это может привести к неожиданным результатам, если в строках будет больше слов после сопоставления с шаблоном после пробелов.

import re

str1 = '2+ years in buy side research or accounting'
pattern = re.compile(r'([0-9]+\+?\s*years?\s+in\s+)(\w+(?:\s+\w+)*(?:\s+or\s+\w+(?:\s+\w+)*)*)')
res = []
for m, n in re.findall(pattern, str1):
    for x in re.split(r'\s+or\s+', n):
        res.append("{}{}".format(m, x))

print(res) # => ['2+ years in buy side research', '2+ years in accounting']

См. Демонстрационную версию Python

Регулярное выражение

([0-9]+\+?\s*years?\s+in\s+)(\w+(?:\s+\w+)*(?:\s+or\s+\w+(?:\s+\w+)*)*)

См. Демонстрационную модель .Подробности:

  • ([0-9]+\+?\s*years?\s+in\s+) - группа 1:
    • [0-9]+ - 1+ цифр
    • \+? - необязательно +
    • \s* - 0+ пробелов
    • years? - year и дополнительно s
    • \s+ - 1+ пробелов
    • in- in слово
    • \s+ - 1+ пробелы
  • (\w+(?:\s+\w+)*(?:\s+or\s+\w+(?:\s+\w+)*)*) - Группа 2:
    • \w+(?:\s+\w+)* - 1+символы слова, а затем 0 или более повторений из 1+ пробелов и 1+ слова из символов
    • (?:\s+or\s+\w+(?:\s+\w+)*)* - 0 или более повторений or, заключенные в 1+ пробелы и затем сопровождаемые шаблоном выше
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...