Один из способов - использовать шаблон и извлечь то, что находится между круглыми скобками, используя группу захвата ([^()]+)
и класс отрицательных символов, соответствующий любому символу, кроме (
или )
. Это немного общий шаблон:
\(([^()]+)\)
Regex demo
Вы можете сделать его более конкретным c, указав, что вы разрешите использовать символ класс и повторяющиеся группы, чтобы немного приблизиться к формату данных:
\((\w+(?: [\w&]+)*, \d{4}(?:; \w+(?: [\w&]+)*, \d{4})*)\)
\(
Соответствие (
(
Capture группа 1 \w+
Совпадение с 1+ символами слов, (?: [\w&]+)*, \d{4}
повторение 0+ раз с пробелом, 1+ слов с символами или &
, пробел и 4 цифры (?:; \w+(?: [\w&]+)*, \d{4})*
Повтор предыдущего шаблона 0+ раз, перед которым стоит ;
)
Закрыть группу \)
Матч )
Regex demo
import re
test_text = ['Sentence 1 (Author, 2019).',
'Sentence 2 (Another Author, 2020)',
'Sentence 3 (First Author & Second Author, 2018)',
'Sentence 4 (Author, 2019; Another Author, 2020; Fourth Author, 2017)']
test_list = []
pattern = r'\(([^()]+)\)'
for elem in test_text:
for splitOne in re.search(pattern, elem).group(1).split(";"):
for splitTwo in splitOne.split(":"):
test_list.append(splitTwo.strip())
print("FULL LIST OF PULL:\n", test_list)
Output
FULL LIST OF PULL:
['Author, 2019', 'Another Author, 2020', 'First Author & Second Author, 2018', 'Author, 2019', 'Another Author, 2020', 'Fourth Author, 2017']
Или создайте список списков, используя, например, this Python demo .
Другим вариантом является использование модуля регулярных выражений PyPi , который поддерживает использование квантификатора в просмотре.
Например:
(?<=\([^()]*)\w+(?: [\w&]+)*, \d+(?=[^\r\n()]*\))
В шаблоне открывается отверстие (
слева и в закрывающем )
справа, где шаблон соответствует слову chars и цифрам. в середине шаблона.
Regex demo (Javascript выбрано только для демонстрационных целей) | Или посмотрите Python демо