我试图编写一个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\>\"\<)])+
非常感谢任何关于如何使这项工作的想法。
答案 0 :(得分:0)
你有一个“你应该逃脱。”
["&\']
如果不起作用,请修复仅指向常规页面的regex101参考。
填写正则表达式和一些示例可以帮助我们进一步解决问题。
答案 1 :(得分:0)
除非您使用"
进行转移,否则不能在"
引用的字符串中使用\"
。
或者您可以使用三个双引号:"""\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?!["&\'])\S)+)\b"""