[英]How to extract a specific type of number from a string using regex?
考慮這個字符串:
text = '''
4 500,5
12%
1,63%
568768,74832 days in between
34 cars in a row'''
如您所見,有簡單數字、中間有空格的數字、帶逗號的數字,以及兩者都有。 因此, 4 500,5
被視為一個獨立的獨立數字。 用逗號和空格提取數字很容易,我發現模式如下:
pattern = re.compile(r'(\d+ )?\d+,\d+')
但是,我正在努力提取像 12 和 34 這樣的簡單數字。我嘗試使用(?!...)
和[^...]
但這些選項不允許我排除其他數字中不需要的部分。
((?:\\d+ )?\\d+,\\d+)|(\\d+(?! \\d))
我相信這會做你想做的(Regexr 鏈接: https ://regexr.com/695tc)
為了捕獲“簡單”數字,它查找 [一個或多個數字],后面沒有 [一個空格和另一個數字]。
我進行了編輯,以便您可以根據需要適當地使用捕獲組。
如果只想匹配 12 和 34:
(?<!\S)\d+\b(?![^\S\n]*[,\d])
(?<!\\S)
斷言左邊的空白邊界\\d+\\b
匹配 1+ 個數字和一個單詞邊界(?!
負前瞻,斷言直接在右邊的不是
[^\\S\\n]*[,\\d]
匹配可選空格和,
或一個數字)
關閉前瞻我建議先提取所有數字,然后將帶有逗號的數字過濾為帶浮點數的列表,將沒有逗號的過濾為整數列表:
import re
text = '4 500,5\n\n12%\n\n1,63%\n\n568768,74832 days in between\n\n34 cars in a row'
number_rx = r'(?<!\d)(?:\d{1,3}(?:[ \xA0]\d{3})*|\d+)(?:,\d+)?(?!\d)'
number_list = re.findall(number_rx, text)
print('Float: ', [x for x in number_list if ',' in x])
# => Float: ['4 500,5', '1,63', '568768,74832']
print('Integers: ', [x for x in number_list if ',' not in x])
# => Integers: ['12', '34']
正則表達式匹配:
(?<!\\d)
- 一個負向后視,不允許在當前位置的左側直接出現數字(?:\\d{1,3}(?:[ \\xA0]\\d{3})*|\\d+)
- 兩種選擇之一:
\\d{1,3}(?:[ \\xA0]\\d{3})*
- 一位、兩位或三位數字,然后出現零次或多次空格/硬(不間斷)空格后跟三位數字|
- 或者\\d+
- 一位或多位數字(?:,\\d+)?
- 的可選序列,
然后是一個或多個數字(?!\\d)
- 一個負向前瞻,不允許在當前位置的右側有任何數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.