如何使用Python和正则表达式从引文中提取页码?

时间:2015-04-28 14:58:42

标签: python regex bibliography citations

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

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

  • 期刊名称,卷。 20号,2号;页。 15
  • 期刊名称,卷。 20,第2号:人名(1990-2010);页。 15
  • 期刊名称,卷。 20,第2号:人名(1990-2010); pp。 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+)

上面以粗体显示的值是匹配的。

我希望改进该正则表达式,使其与“ISSN&#39;之后的任何\d+-\d+都不匹配或者&#39; ISSN:&#39;。我尝试使用(?<![ISSN:?\s])添加后视,但没有成功。

有关如何实现这一点并仅匹配以下值的任何想法?

  • 期刊名称,卷。 20号,2号;页。 15
  • 期刊名称,卷。 20,第2号:人名(1990-2010);页。 15
  • 期刊名称,卷。 20,第2号:人名(1990-2010); pp。 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

2 个答案:

答案 0 :(得分:1)

这解决了我的问题:

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

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

答案 1 :(得分:0)

您可以使用^$锚点继续使用其他负面展示:

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

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

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

Demo

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