python regex:从字符串中提取数字,未知数字格式

时间:2018-06-30 05:25:04

标签: python regex

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

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

类似于blah blah $ 2,400blah blah 45%blah blah $1.23blah blah 7

如果它足够智能,可以像blah blah seven

这样处理单词数字,将会很有趣

我不需要美元符号,只需要数字

4 个答案:

答案 0 :(得分:2)

尽管此问题有很多情况,但以下是一种解决方案,可以使用一些正则表达式和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]

答案 1 :(得分:1)

如果您坚持使用正则表达式,那么这应该可以工作(仅限于您提到的情况):

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,我不认为正则表达式会减少它(至少对于比一位数字更复杂的东西不会如此)。

答案 2 :(得分:1)

要从具有不同格式的字符串中提取第一个数字,可以使用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

答案 3 :(得分:1)

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

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