我正在尝试使用正则表达式从引用中提取页码。
下面是我正在处理的测试数据:
当使用以下正则表达式时:
(?![^()]*\))(\d+-\d+)上面粗体的值是匹配的。
我希望改进这个正则表达式,使其不匹配在“ISSN”或“ISSN:”之后出现的任何\d+-\d+。我尝试过使用(?<![ISSN:?\s])添加一个外观,但没有成功。
对于如何做到这一点,并只匹配下面的价值观,有什么想法吗?
发布于 2015-04-28 15:31:53
这解决了我的问题:
re.search(r'[^ISN:?](?![^()]*\))\s(\d+-\d+)', s).group(1)谢谢大家的帮助。更好的解决办法仍然值得欢迎。
发布于 2015-04-28 15:04:23
您可以使用^和$锚点的另一个负面展望:
^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$请注意,如果要在多行文本上应用此正则表达式,则需要使用re.M标志!这使得开始和结束锚与每一行的开始和结束匹配,而不是整个字符串!
此外,您还需要在第二个组\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']https://stackoverflow.com/questions/29922816
复制相似问题