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

Python 正则表达式将PDF中的DOI与PyPDF2匹配,python,regex,Python,Regex,我正在尝试编写一个Python脚本,使用PyPDF2和我发现的以下正则表达式从PDF中提取DOI 尽管当我在各种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(

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

尽管当我在各种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))
文件/Users/fort/Documents/Dropbox/Code/Python/pdf2doi/pdf2doi.py,第9行 doi_re=re.compile\b10[.][0-9]{4,}?:[.][0-9]+*/?:?![&\']\S+\b ^ SyntaxError:行连续字符后出现意外字符 我的编辑器的语法高亮显示表明解析器不喜欢']\s+\b,因此我尝试对其前面的双引号进行转义,从而解决了这个特殊问题,即

\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?![\"&\'])\S)+)\b
但是,正则表达式不再与doi匹配。将正则表达式括在单引号中也可以修复此语法错误,但结果相同

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

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

如果您有任何关于如何使其工作的想法,我们将不胜感激。

您有一个更早的建议,您应该逃避。在

["&\']
如果这不起作用,请修复只指向常规页面的regex101引用

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

除非使用\进行传输,否则不能在带引号的字符串中使用


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

这里是,正则表达式匹配一个非常复杂、虚假但有效的DOI。正如我在OP中提到的,逃逸正则表达式的断点,即它无法匹配DOI。不幸的是,当我在脚本中使用它时,它仍然无法匹配DOI,并抛出以下错误AttributeError:“NoneType”对象没有属性“group”@fort这意味着m为None且文本与模式不匹配。是的,但只有在我转义导致脚本中出现问题的时才会发生这种情况。然而,根据regex101,regex本身是一个有效的Python风格的regex,它匹配所有doi。如果我在OP中使用最后一个正则表达式,脚本将正确提取一些DOI。
["&\']