我试图使用正则表达式从引文中提取页码。
以下是我正在使用的测试数据:
使用以下正则表达式时:
(?![^()]*\))(\d+-\d+)
上面以粗体显示的值是匹配的。
我希望改进该正则表达式,使其与“ISSN'之后的任何\d+-\d+
都不匹配或者&#39; ISSN:&#39;。我尝试使用(?<![ISSN:?\s])
添加后视,但没有成功。
有关如何实现这一点并仅匹配以下值的任何想法?
答案 0 :(得分:1)
这解决了我的问题:
re.search(r'[^ISN:?](?![^()]*\))\s(\d+-\d+)', s).group(1)
感谢大家的帮助。仍然欢迎更好的解决方案。
答案 1 :(得分:0)
您可以使用^
和$
锚点继续使用其他负面展示:
^((?!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']