[英]Regex Match on String (DOI)
嗨,我很難理解為什么我的正則表達式不起作用。
我的 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
我正在使用例如這個正則表達式,但它總是返回空?
print(re.findall(r'/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i', 'https://dx.doi.org/10.1108/02652320410549638?nols=y'))
我哪里出錯了?
看起來您來自另一種編程語言,該語言具有正則表達式文字的概念,這些文字用正斜杠分隔,並且在右斜杠之后有修飾符(因此/i
)。
在 Python 中沒有這樣的東西,這些斜杠和修飾符被視為文字字符。 對於像i
這樣的標志,您可以使用findall
的可選flags
參數。
其次, ^
將匹配輸入字符串的開頭,但顯然您輸入的 URL 不以10
開頭,因此必須為 go。 相反,您可以要求10
必須遵循一個分詞...即它不應該由一個字母數字字符(或下划線)之前。
同樣, $
將匹配輸入字符串的結尾,但是您的 URL 以 URL 參數繼續,例如?nols=y
,因此您感興趣的部分在輸入結束之前不會 go 繼續。 所以這也必須是 go 。
點在正則表達式中具有特殊含義,但您顯然打算匹配文字點,因此應該對其進行轉義。
最后,字母數字字符可以與\w
匹配,它也匹配小寫和大寫拉丁字母,因此您可以稍微縮短字符 class 並且不使用任何標志,例如i
( re.I
)。
這給我們留下了:
print(re.findall(r'\b10\.\d{4,9}/[-.;()/:\w]+',
'https://dx.doi.org/10.1108/02652320410549638?nols=y'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.