簡體   English   中英

如何使用正則表達式從字符串中提取特定類型的數字?

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

請參閱Python 演示正則表達式演示

正則表達式匹配:

  • (?<!\\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.

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