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*—

详细信息

  • ([A-Z]+(?:\W+\W+)
    -捕获组1(其内容将作为
    re.findall
    的结果返回)捕获
    • [A-Z]+
      -1个或多个ASCII大写字母
    • (?:\W+\W+)
      -1或0次出现1+非单词字符(
      \W+
      )和1+单词字符(
      \W+
  • \s*
    -0+空格
  • -
    -一个
    -
    符号
:

重新导入
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*—

详细信息

  • ([A-Z]+(?:\W+\W+)
    -捕获组1(其内容将作为
    re.findall
    的结果返回)捕获
    • [A-Z]+
      -1个或多个ASCII大写字母
    • (?:\W+\W+)
      -1或0次出现1+非单词字符(
      \W+
      )和1+单词字符(
      \W+
  • \s*
    -0+空格
  • -
    -一个
    -
    符号
:

重新导入
rx=r“([A-Z]+(?:\W+\W+)?\s*-”
s=“|[广告,米兰·施鲁厄和艾丽莎·鲁宾2016年10月5日,布鲁塞尔-布鲁塞尔附近一名男子用刀打伤两名警官…]\n[广告,大卫·乔利2016年2月8日,阿富汗喀布尔-一名塔利班自杀式炸弹手于2016年6月6日炸死至少三人”
打印(关于findall(rx,s))#=>[“布鲁塞尔”、“喀布尔、阿富汗”]

Try
r'([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']