簡體   English   中英

字符串正則表達式匹配 (DOI)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM