使用Python正则表达式从采访记录中提取文本

使用Python正则表达式从采访记录中提取文本,python,regex,text-extraction,Python,Regex,Text Extraction,我正在使用Python 3分析政治访谈的记录。但我正在努力让正则表达式正常工作 我有很多这种格式的.txt文件: NAME_OF_JOURNALIST: Lorem ipsum dolor sit amet, consectetur adipiscing elit. PRIME MINISTER: Aenean tempus feugiat leo, ut tristique mauris tempus sed. NAME_OF_JOURNALIST: Aenean id felis

我正在使用Python 3分析政治访谈的记录。但我正在努力让正则表达式正常工作

我有很多这种格式的.txt文件:

NAME_OF_JOURNALIST:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

PRIME MINISTER:

Aenean tempus feugiat leo, ut tristique mauris tempus sed.

NAME_OF_JOURNALIST:

Aenean id felis neque. Nam ornare turpis et dolor elementum auctor.

PRIME MINISTER:

Donec rutrum, erat a faucibus consectetur, mi nisi rhoncus augue, et rutrum purus lorem id arcu.

NAME_OF_JOURNALIST:

Aenean id felis neque. Nam ornare turpis et dolor elementum auctor.
NAME\u OF\u是一个变量,在每个文件中都会发生更改。我对记者说的话不感兴趣,只对首相说的话感兴趣。因此,我需要分离并提取文本中以
首相
开头,以
记者姓名
结尾的部分

我已尝试使用以下正则表达式:

PRIME.+(?!PRIME)(?!MINISTER)\b[A-Z][A-Z][A-Z]+\b

但是它没有捕获我需要的文本。我不知道我做错了什么。任何帮助都将不胜感激

谢谢大家!

试试这个正则表达式:

PRIME MINISTER:[\n]+(.+)


你的正则表达式似乎什么都不匹配。不确定您的目标是什么。

使用
re.findall
和lookback&Lookahead

Ex:

import re
s = """NAME_OF_JOURNALIST:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

PRIME MINISTER:

Aenean tempus feugiat leo, ut tristique mauris tempus sed.

NAME_OF_JOURNALIST:

Aenean id felis neque. Nam ornare turpis et dolor elementum auctor.

PRIME MINISTER:

Donec rutrum, erat a faucibus consectetur, mi nisi rhoncus augue, et rutrum purus lorem id arcu.

NAME_OF_JOURNALIST:

Aenean id felis neque. Nam ornare turpis et dolor elementum auctor."""

for text in re.findall(r"(?<=PRIME MINISTER:).*?(?=NAME_OF_JOURNALIST:)", s, flags=re.DOTALL):
    print(text.strip())
Aenean tempus feugiat leo, ut tristique mauris tempus sed.
Donec rutrum, erat a faucibus consectetur, mi nisi rhoncus augue, et rutrum purus lorem id arcu.

我们可以在这里像这样使用lookarounds:

(?<=PRIME MINISTER:\s)[\s\S]*?(?=NAME_OF_JOURNALIST:\s|\s*\Z)
(?

记者姓名是可变的。首相的内容也可以包含“:”。

只有当首相的文本总是在一行时才有效。试试看,或者如果首相应该是比赛的一部分,
re.findall(r'(?sm)PRIME:\s*?(?=^[a-Z][\w]*:|\Z)
。如果首相有最后一句话,则无法正常工作。
import re

reg=re.compile(r"(?ms)^\s*PRIME MINISTER:\s*[\r\n]+(.+?)^[\s\w]+:\s*$")
for m in reg.finditer(text):
    print(m.group(1))

"""
(?ms)                           m: multiline, s: dot matches at all, \n, too;

^\s*PRIME MINISTER:\s*[\r\n]+   section begins with a line starting(^) with some/none spaces and PM, and ending with newline;

^[\s\w]+:\s*$                   section stops at a line starting with words and ending($) with ":" and some/none spaces.

(.+?)                           the wanted content
"""