Возможный подход здесь состоит в том, чтобы сопоставить все слова, разделенные пробелами после 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+ пробелы и затем сопровождаемые шаблоном выше