使用Python正则表达式从采访记录中提取文本
我正在使用Python 3分析政治访谈的记录。但我正在努力让正则表达式正常工作 我有很多这种格式的.txt文件:使用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
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
"""