Regex 使用正则表达式匹配位置| Python
我从一个网站上搜刮了几篇文章。现在我正试图提取新闻的位置。该地点要么以该国首都(如“布鲁塞尔-”)大写,要么在某些情况下随该国(如“比利时布鲁塞尔”)大写 这是文章的一个样本:Regex 使用正则表达式匹配位置| Python,regex,python-3.x,Regex,Python 3.x,我从一个网站上搜刮了几篇文章。现在我正试图提取新闻的位置。该地点要么以该国首都(如“布鲁塞尔-”)大写,要么在某些情况下随该国(如“比利时布鲁塞尔”)大写 这是文章的一个样本: |[<p>Advertisement , By MILAN SCHREUER and ALISSA J. RUBIN OCT. 5, 2016 , BRUSSELS — A man wounded two police officers with a knife in Brusse
|[<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]
我使用分数符号(-)的原因是因为链接到位置的循环模式
然而,这个正则表达式设法提取了“布鲁塞尔-”,但当涉及到“喀布尔,阿富汗-”,它只提取了最后一部分,即“阿富汗-”。
在第二种情况下,我想提取整个位置:首都和国家。有什么想法吗?您可以做的一件事是在第一个字符选择中添加
、
和\s
,然后从左侧去除所有空格和逗号。,[A-Z,\s]{1,}\w+\s\-
或者更简单的东西,比如:
,(.+)\-
<代码>$1将是您的匹配项,包含额外的符号。另一个可能有效的选项:,\s*([A-Za-z]*[,\s]*[A-Za-z]*)\s\-
或简化版本:,\s*([A-Za-z,\s]*)\s\-
。再次说明,$1
是您的匹配项。您可以做的一件事是在第一个字符选择中添加、
和\s
,然后从左侧删除所有空格和逗号。,[A-Z]{1,}\w+\s\
或者更简单的东西,比如:,(.+)\-
<代码>$1将是您的匹配项,包含额外的符号。另一个可能有效的选项:,\s*([A-Za-z]*[,\s]*[A-Za-z]*)\s\-
或简化版本:,\s*([A-Za-z,\s]*)\s\-
。再一次$1
是您的对手。您可以使用
([A-Z]+(?:\W+\w+)?)\s*—
见
详细信息:
-捕获组1(其内容将作为([A-Z]+(?:\W+\W+)
的结果返回)捕获re.findall
-1个或多个ASCII大写字母[A-Z]+
-1或0次出现1+非单词字符((?:\W+\W+)
)和1+单词字符(\W+
)\W+
-0+空格\s*
-一个-
符号-
重新导入
rx=r“([A-Z]+(?:\W+\W+)?\s*-”
s=“|[广告,米兰·施鲁厄和艾丽莎·鲁宾2016年10月5日,布鲁塞尔-布鲁塞尔附近一名男子用刀打伤两名警官…]\n[广告,大卫·乔利2016年2月8日,阿富汗喀布尔-一名塔利班自杀式炸弹手于2016年6月6日炸死至少三人”
打印(关于findall(rx,s))#=>[“布鲁塞尔”、“喀布尔、阿富汗”]
您可以使用
([A-Z]+(?:\W+\w+)?)\s*—
见
详细信息:
-捕获组1(其内容将作为([A-Z]+(?:\W+\W+)
的结果返回)捕获re.findall
-1个或多个ASCII大写字母[A-Z]+
-1或0次出现1+非单词字符((?:\W+\W+)
)和1+单词字符(\W+
)\W+
-0+空格\s*
-一个-
符号-
重新导入
rx=r“([A-Z]+(?:\W+\W+)?\s*-”
s=“|[广告,米兰·施鲁厄和艾丽莎·鲁宾2016年10月5日,布鲁塞尔-布鲁塞尔附近一名男子用刀打伤两名警官…]\n[广告,大卫·乔利2016年2月8日,阿富汗喀布尔-一名塔利班自杀式炸弹手于2016年6月6日炸死至少三人”
打印(关于findall(rx,s))#=>[“布鲁塞尔”、“喀布尔、阿富汗”]
Tryr'([A-Z]+)(?:\W+\W+)?\s*-'
。看,当我运行它时,它只匹配大写的单词,当大写后面跟一个逗号以及我想提取的国家时,只需将)
移远一点:@WiktorStribiżew它工作得很好,你能解释一下与上一个单词相比的主要变化吗?试试r'([a-Z]+)(?:\W+\W+)?\s*-'
。看,当我运行它时,它只匹配大写的单词,当大写后面跟一个逗号,以及我想提取的国家时,只需将)移远一点:@WiktorStribiż如果它工作得很好,你能解释一下与上一个单词相比的主要变化吗?
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']