2

我正在尝试使用正则表达式从引文中提取页码。

这是我正在使用的测试数据:

  • 期刊名称,卷。20,第2号;页。15
  • 期刊名称,卷。20、第2期:人名(1990-2010);页。15
  • 期刊名称,卷。20、第2期:人名(1990-2010);第15-20页
  • 期刊名称,卷。20、第2期:人名(1990-2010);第 15 页-
  • 期刊名称,卷。20,第2号;20-25
  • 期刊名称,卷。20,第2号;ISSN:1234-1234(印刷版);20-25
  • 期刊名称,卷。20,第2号;20-25 ; ISSN:1234-1234(印刷版)
  • 期刊名称,卷。20,第2号;ISSN:1234-1234(印刷版);ISSN:1234-1234(在线);20-25
  • 期刊名称,卷。20,第2号;ISSN 1234-1234(印刷版);ISSN 1234-1234(在线);20-25

使用以下正则表达式时:

(?![^()]*\))(\d+-\d+)

上面粗体的值是匹配的。

我想改进该正则表达式,使其与\d+-\d+“ISSN”或“ISSN:”之后的任何内容都不匹配。我试过添加一个后视使用(?<![ISSN:?\s])但没有成功。

关于如何实现这一目标并仅匹配以下值的任何想法?

  • 期刊名称,卷。20,第2号;页。15
  • 期刊名称,卷。20、第2期:人名(1990-2010);页。15
  • 期刊名称,卷。20、第2期:人名(1990-2010);第15-20页
  • 期刊名称,卷。20、第2期:人名(1990-2010);第 15 页-
  • 期刊名称,卷。20,第2号;20-25
  • 期刊名称,卷。20,第2号;ISSN:1234-1234(印刷版);20-25
  • 期刊名称,卷。20,第2号;20-25 ; ISSN:1234-1234(印刷版)
  • 期刊名称,卷。20,第2号;ISSN:1234-1234(印刷版);ISSN:1234-1234(在线);20-25
  • 期刊名称,卷。20,第2号;ISSN 1234-1234(印刷版);ISSN 1234-1234(在线);20-25
4

2 回答 2

1

这解决了我的问题:

re.search(r'[^ISN:?](?![^()]*\))\s(\d+-\d+)', s).group(1)

谢谢大家帮忙。仍然欢迎更好的解决方案。

于 2015-04-28T15:31:53.660 回答
0

^您可以对和$锚使用另一种负面展望:

^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$

请注意,如果您想在多行文本上应用此正则表达式,您需要使用re.Mflag! 使开始和结束锚点匹配每行的开始和结束,而不是整个字符串!

此外,您需要\s在第二组之前添加一个,s(\d+-\d+)然后您的正则表达式中的第二个匹配将是所需的数字!

演示

>>> s="""Journal Name, Vol. 20, No. 2; p. 15
... Journal Name, Vol. 20, No. 2: Human Name (1990-2010); p. 15
... Journal Name, Vol. 20, No. 2: Human Name (1990-2010); pp. 15-20
... Journal Name, Vol. 20, No. 2: Human Name (1990-2010); pp. 15-
... Journal Name, Vol. 20, No. 2; 20-25
... Journal Name, Vol. 20, No. 2; ISSN: 1234-1234 (Print); 20-25
... Journal Name, Vol. 20, No. 2; 20-25; ISSN: 1234-1234 (Print)
... Journal Name, Vol. 20, No. 2; ISSN: 1234-1234 (Print); ISSN: 1234-1234 (Online); 20-25
... Journal Name, Vol. 20, No. 2; ISSN 1234-1234 (Print); ISSN 1234-1234 (Online); 20-25"""
>>> 

>>> re.findall(r'^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$',s,re.M)
[('.', '15-20'), (';', '20-25')]

并获取数字:

>>> [i[-1] for i in re.findall(r'^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$',s,re.M)]
['15-20', '20-25']
于 2015-04-28T15:04:23.167 回答