簡體   English   中英

python regex:從字符串中提取數字,未知數字格式

[英]python regex: extracting number from string, unknown number format

我需要從字符串中提取第一個數字,但是我不知道數字的確切格式。

該數字可能是以下格式之一... 1.224十進制數... 3,455,000某個數字,逗號數量未知... 45%的百分比...或只是整數5

就像是blah blah $ 2,400blah blah 45%blah blah $1.23blah blah 7

如果它足夠智能,可以像blah blah seven這樣的單詞數字,那將很有趣

我不需要美元符號,只需要數字

盡管此問題有很多情況,但以下是一個解決方案,它使用一些正則表達式和re模塊解決了大多數問題:

import re

def extractVal(s):
    return re.sub(r'^[^0-9$\-]*| .*$', '', s)

(1)刪除所有非0-9或$的前導字符串字符

(2)刪除所有開頭字符,包括第一個空格(在(1)之后)

以下是一些實際數據:

>>> data = ['blah $50,000 10', 'blah -1.224 blah', 'blah 3,455,000 blah', 'blah 45% 10 10 blah', '5 6 4']
>>> print(list(map(extractVal,data)))
['$50,000', '-1.224', '3,455,000', '45%', '5']

此解決方案假定第一個數字以空格結尾。

通過將這些字符串轉換為數字,我們可以像其他人所說的走得更遠:

def valToInt(s):
    if '%' in s:
        a = float(s[:-1])/100
    else:
        a =  float(re.sub(r'[,$]','',s))
    return int(a) if a == int(a) else a

結果(再次使用map()函數):

[50000, -1.224, 3455000, 0.45, 5]

如果您堅持使用正則表達式,那么這應該可以工作(僅限於您提到的情況):

rgx = re.compile(r'\d+(,|\.)?\d*')
assert rgx.search("blah blah $ 2,400")
assert rgx.search("blah blah 45%")
assert rgx.search("blah blah $1.23")
assert rgx.search("blah blah 7")

至於blah blah seven我不認為正則表達式會減少它(至少不是比一位數字更復雜的東西)。

要從具有不同格式的字符串中提取第一個數字,可以使用re.findall()

 import re

strings = ['45% blah 43%', '1.224 blah 3.2', '3,455,000 blah 4,3', '$1.2 blah blah $ 2,400', '3 blah blah 7']

for string in strings:
    first_match = re.findall(r'[0-9$,.%]+\d*', string)[0]
    print(first_match)

哪些輸出:

45%
1.224
3,455,000
$1.2
3

假設您需要一個實際數字,並且該百分比應轉換為小數:

str_ = "blah blah $ 2,400"
number, is_percent = re.search(r"([0-9,.]+)\s*(%?)", str_).groups() or (None, None)
if number is not None:
    number = float(number.replace(",", ""))
    if is_percent:
        number /= 100

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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