正则表达式将PDF中的DOI与PyPDF2相匹配

时间:2014-10-11 09:48:06

标签: python regex

我试图编写一个Python脚本,使用PyPDF2和以下正则表达式从PDF中提取DOI,我发现here

\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'])\S)+)\b

虽然当我在regex101上对所有类型的DOI进行测试时,这个正则表达式工作得很好,但是当我在下面的脚本中使用它时,它会引发下面的错误:

#!/usr/bin/env python
# -*- encoding:utf-8 -*-

from PyPDF2 import PdfFileReader
import re
import sys

pdf_file = sys.argv[1]
doi_re = re.compile("\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'])\S)+)\b")
input = PdfFileReader(file(pdf_file, "rb"))
text = input.getPage(0).extractText()

m = doi_re.search(text)
print(m.group(0))
File "/Users/fort/Documents/Dropbox/Code/Python/pdf2doi/pdf2doi.py", line 9
doi_re = re.compile("\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'])\S)+)\b")
                                                                          ^
SyntaxError: unexpected character after line continuation character

我的编辑器的语法突出显示解析器不喜欢'])\S)+)\b"),所以我尝试转义它之前的双引号,这样可以摆脱那个特定的问题,即

\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?![\"&\'])\S)+)\b

然而,正则表达式不再匹配DOI。 (用单引号括起正则表达式也修复了这种语法错误,但结果相同。)

最后,如果我使用以下正则表达式,脚本确实匹配一些DOI,但它错过了很多:

10.(\d)+/([^(\s\>\"\<)])+

非常感谢任何关于如何使这项工作的想法。

2 个答案:

答案 0 :(得分:0)

你有一个“你应该逃脱。”

["&\']

如果不起作用,请修复仅指向常规页面的regex101参考。

填写正则表达式和一些示例可以帮助我们进一步解决问题。

答案 1 :(得分:0)

除非您使用"进行转移,否则不能在"引用的字符串中使用\"

或者您可以使用三个双引号:"""\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'])\S)+)\b"""