匹配位置与正则表达式|蟒

时间:2016-11-24 21:12:25

标签: regex python-3.x

我从网站上搜集了几篇文章。现在我想提取新闻的位置。该地点仅以国家首都(例如“布鲁塞尔 - ”)或在某些情况下与国家(例如“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,阿富汗 - ”时它只提取最后一部分,即“阿富汗 - ”。 在第二种情况下,我想提取整个地点:首都和国家。有什么想法吗?

2 个答案:

答案 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
  • - 符号

Python demo

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']