首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python和正则表达式从引用中提取页码?

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

Stack Overflow用户
提问于 2015-04-28 14:58:41
回答 2查看 799关注 0票数 2

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

下面是我正在处理的测试数据:

  • “日刊名称”,第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

当使用以下正则表达式时:

代码语言:javascript
复制
(?![^()]*\))(\d+-\d+)

上面粗体的值是匹配的。

我希望改进这个正则表达式,使其不匹配在“ISSN”或“ISSN:”之后出现的任何\d+-\d+。我尝试过使用(?<![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
EN

回答 2

Stack Overflow用户

发布于 2015-04-28 15:31:53

这解决了我的问题:

代码语言:javascript
复制
re.search(r'[^ISN:?](?![^()]*\))\s(\d+-\d+)', s).group(1)

谢谢大家的帮助。更好的解决办法仍然值得欢迎。

票数 1
EN

Stack Overflow用户

发布于 2015-04-28 15:04:23

您可以使用^$锚点的另一个负面展望:

代码语言:javascript
复制
^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$

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

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

演示

代码语言:javascript
复制
>>> 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')]

为了得到数字:

代码语言:javascript
复制
>>> [i[-1] for i in re.findall(r'^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$',s,re.M)]
['15-20', '20-25']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29922816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档