嗨,我很难理解为什么我的Regex不起作用。
我有URL,上面有DOI,就像这样:
https://link.springer.com/10.1007/s00737-021-01116-5
https://journals.sagepub.com/doi/pdf/10.1177/1078390319877228
https://journals.sagepub.com/doi/pdf/10.1177/1078390319877228
https://onlinelibrary.wiley.com/doi/10.1111/jocn.13435
https://journals.sagepub.com/doi/pdf/10.1177/1062860613484171
https://onlinelibrary.wiley.com/resolve/openurl?genre=article&title=Natural+Resources+Forum&issn=0165-0203&volume=26&date=2002&issue=1&spage=3
https://dx.doi.org/10.1108/14664100110397304?nols=y
https://onlinelibrary.wiley.com/doi/10.1111/jocn.15833
https://www.tandfonline.com/doi/pdf/10.1080/03768350802090592?needAccess=true我用的是这个Regex,但是它总是返回空的?
print(re.findall(r'/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i', 'https://dx.doi.org/10.1108/02652320410549638?nols=y'))我哪里出错了?
发布于 2022-08-01 15:54:53
看起来,您来自另一种编程语言,它有regex文字的概念,这些字面值是用正斜杠分隔的,并且在结束斜杠后面有修饰符(因此是/i)。
在Python中没有这样的东西,这些斜杠和修饰符被视为文字字符。对于像i这样的标志,您可以使用findall的可选flags参数。
其次,^将与输入字符串的开头相匹配,但很明显,作为输入的URL不以10开头,所以必须这样做。相反,您可以要求10必须跟随一个单词中断..。也就是说,它之前不应该有字母数字字符(或下划线)。
类似地,$将匹配输入字符串的末尾,但是您有URL参数,比如?nols=y,所以您感兴趣的部分在输入结束之前不会继续。所以这也必须去做。
这个点在regex中有一个特殊的含义,但是您显然想要匹配一个文字点,所以它应该转义。
最后,字母数字字符可以与\w匹配,这也匹配小写字母和大写拉丁字母,因此您可以稍微缩短字符类,并且不需要任何标志,比如i (re.I)。
这使我们有:
print(re.findall(r'\b10\.\d{4,9}/[-.;()/:\w]+',
'https://dx.doi.org/10.1108/02652320410549638?nols=y'))https://stackoverflow.com/questions/73196058
复制相似问题