[英]python regex: extracting number from string, unknown number format
我需要從字符串中提取第一個數字,但是我不知道數字的確切格式。
該數字可能是以下格式之一... 1.224
十進制數... 3,455,000
某個數字,逗號數量未知... 45%
的百分比...或只是整數5
就像是blah blah $ 2,400
或blah blah 45%
或blah blah $1.23
或blah 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.