Python 正则表达式:从字符串中提取数字,未知数字格式



我需要从字符串中提取第一个数字,但我不知道数字的确切格式。

该数字可能是以下格式之一...1.224一些小数...3,455,000一些逗号数量未知的数字...45%百分比...或只是一个整数5

它会像blah blah $ 2,400blah blah 45%blah blah $1.23blah 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

虽然这个问题有很多情况,但这里有一个解决方案,它使用一些正则表达式和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我不认为正则表达式会削减它(至少不会比个位数更复杂的东西(。

假设你想要一个实际的数字,并且百分比应该转换为小数:

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

最新更新