我有以下函式可以找到正常數、十進制數和分數數(并保留前導零,并根據需要檢測數字的符號):
def extract_numbers(text):
numbers = re.findall(r"[- ]?\d*\.\d |[- ]?\d*/\d |[- ]?\d ", text)
return numbers
的問題,當我與測驗它發生具有在分子或分母小數部分數:
print(extract_numbers('this is difficult to get: -124.01/11.1'))
輸出:
['-124.01', '/11', '.1']
當我需要它是這樣的:
['-124.01/11.1']
那么如何調整正則運算式以提取具有此優先 級的數字:帶小數的分數,然后是分數,然后是小數,最后是正常數
uj5u.com熱心網友回復:
您可以使用
[- ]?\d*\.?\d (?:/\d*\.?\d )?
請參閱正則運算式演示。詳情:
[- ]?- 一個可選的標志\d*- 零個或多個數字\.?- 一個可選的時期\d- 一位或多位數字(?:/\d*\.?\d )?- 一個可選的序列/- 一個/字符\d*\.?\d- 零個或多個數字、可選句點和一個或多個數字。
uj5u.com熱心網友回復:
您可以使用以下正則運算式來提取所需的字串(當與 Python 的PyPi regex 包一起使用時)。
(?<!([.\d/]))-?(\d (?:\.\d )?)(?:\/(?2))?(?!(?1))
正則運算式演示 < ˉ\ (ツ) /ˉ > Python 演示
正則運算式的操作如下。
(?<! # begin negative lookbehind
( # begin capture group 1
[.\d/] # match one of the indicated characters
) # end capture group 1
) # end negative lookbehind
-? # optionally match '-'
( # begin capture group 2
\d # match 1 digits
(?:\.\d )? # optionally match '.' followed by 1 digits
) # end capture group 2
(?: # begin non-capture group
\/ # match '/'
(?2) # recurse subpattern 2
)? # end non-capture group and make it optional
(?! # begin negative lookahead
(?1) # recurse subpattern 1
) # end negative lookahead
請注意鏈接中開頭的否定后視和結尾的否定前瞻如何避免不適當的匹配。
我本可以使用 Python 的re模塊,但要以更長的正則運算式為代價,但選擇使用 Matthew Barnett 的“regex package”來說明如何使用子例程來簡化運算式。請注意“Regex 演示”鏈接使用 PCRE 引擎,它類似于 PyPi 正則運算式引擎。
下面標記了生成捕獲組 1 和 2 的代碼以及稍后重用該代碼的代碼。
(?<!([.\d/]))-?(\d (?:\.\d )?)(?:\/(?2))?(?!(?1))
111111 2222222222222 yyyy xxxx
參考(?2)導致(?2)被\d (?:\.\d )?(而不是被捕獲組 2 的內容)替換。同理,(?1)替換為[.\d/]。子程式也用于遞回,但在這里,可以簡單地用于避免重復,從而減少錯誤并使運算式更易于閱讀。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/337882.html
上一篇:IDEA 這個小技巧太實用了。。
下一篇:低開銷獲取時間戳
