我从网站上搜集了几篇文章。现在我想提取新闻的位置。该地点仅以国家首都(例如“布鲁塞尔 - ”)或在某些情况下与国家(例如“BRUSELLS,Belgium - ”)一起写成大写;
这是文章的样本:
|[<p>Advertisement , By MILAN SCHREUER and ALISSA J. RUBIN OCT. 5, 2016
, BRUSSELS — A man wounded two police officers with a knife in Brussels around...]
[<p>Advertisement , By DAVID JOLLY FEB. 8, 2016
, KABUL, Afghanistan — A Taliban suicide bomber killed at least three people on Monday and wounded]
我使用的正则表达式就是这个:
text_open = open("Training_News_6.csv")
text_read = text_open.read()
pattern = ("[A-Z]{1,}\w+\s\—")
result = re.findall(pattern,text_read)
print(result)
我使用分数符号( - )的原因是因为是一个链接到该位置的循环模式。
然而,这个正则表达设法提取“布鲁塞尔 - ”但是当谈到“KABUL,阿富汗 - ”时它只提取最后一部分,即“阿富汗 - ”。 在第二种情况下,我想提取整个地点:首都和国家。有什么想法吗?
答案 0 :(得分:0)
您可以做的一件事是将,
和\s
添加到您的第一个字符选择中,然后从左侧删除所有空格和逗号。,[A-Z,\s]{1,}\w+\s\—
甚至更简单的东西,如:,(.+)\—
。 $1
将是您的匹配,包含额外的符号。可能有效的另一个选项:,\s*([A-Za-z]*[,\s]*[A-Za-z]*)\s\—
或简化版本:,\s*([A-Za-z,\s]*)\s\—
。再次$1
是您的匹配。
答案 1 :(得分:0)
您可以使用
([A-Z]+(?:\W+\w+)?)\s*—
请参阅regex demo
<强>详情:
([A-Z]+(?:\W+\w+)?)
- 捕获组1(其内容将作为re.findall
的结果返回)捕获
[A-Z]+
- 一个或多个ASCII大写字母(?:\W+\w+)?
- 1个非字字符(?
)和1个字字符(\W+
)出现1次或0次(由于\w+
量词) / LI>
\s*
- 0+ whitespaces —
- —
符号import re
rx = r"([A-Z]+(?:\W+\w+)?)\s*—"
s = "|[<p>Advertisement , By MILAN SCHREUER and ALISSA J. RUBIN OCT. 5, 2016 \n, BRUSSELS — A man wounded two police officers with a knife in Brussels around...] \n[<p>Advertisement , By DAVID JOLLY FEB. 8, 2016 \n, KABUL, Afghanistan — A Taliban suicide bomber killed at least three people on Mo"
print(re.findall(rx, s)) # => ['BRUSSELS', 'KABUL, Afghanistan']