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

python正则表达式:从字符串中提取数字,未知数字格式,python,regex,Python,Regex,我需要从字符串中提取第一个数字,但我不知道数字的确切格式 数字可以是以下格式之一…1.224某些十进制3455000某些数字的逗号数未知45%百分比。。。或者只是一个整数5 大概是废话$2400或废话$45%或废话$1.23或废话$7 如果它足够聪明,也能像blah blah seven 我不需要美元符号,只要数字如果您坚持使用正则表达式,那么这应该有效(仅限于您提到的情况): 至于诸如此类的七个我不认为正则表达式会减少它(至少对于比一个数字更复杂的事情不会如此)。如果你坚持使用正则表达式,那么

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

数字可以是以下格式之一…
1.224
某些十进制<代码>3455000某些数字的逗号数未知<代码>45%百分比。。。或者只是一个整数
5

大概是
废话$2400
废话$45%
废话$1.23
废话$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()
函数):


虽然这个问题有很多情况,但这里有一个解决方案,它使用一些正则表达式和
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()
函数):


要使用不同的格式从字符串中提取第一个数字,可以使用
re.findall()

哪些产出:

45%
1.224
3,455,000
$1.2
3

要使用不同的格式从字符串中提取第一个数字,可以使用
re.findall()

哪些产出:

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

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

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

什么是“第一个数字”(第一个数字或整个数字)?是否还应提取逗号或小数?什么是“第一个数字”(第一个数字或整个数字)?还应该提取逗号还是小数?最后一件事。。。百分比睡眠时间的文本看起来像这样
blah blah 45%blah
而不是
blah blah 45%blah
。。。在数字和百分号之间有一个额外的空格。。。所以它给了我
45
而不是
45%
。。。这很容易修复吗?您只需在开始时使用
str.replace('%','%')
。。。这可能很难。。。对于
-0.02
的输出,什么是
blahh(2)%blah
?哦,这也只适用于当前的正数。。。可以将括号替换为空字符串。解决方案已更新为使用负数。您可以使用
re.sub('\(|\'),'',s)
。。。百分比睡眠时间的文本看起来像这样
blah blah 45%blah
而不是
blah blah 45%blah
。。。在数字和百分号之间有一个额外的空格。。。所以它给了我
45
而不是
45%
。。。这很容易修复吗?您只需在开始时使用
str.replace('%','%')
。。。这可能很难。。。对于
-0.02
的输出,什么是
blahh(2)%blah
?哦,这也只适用于当前的正数。。。可以将括号替换为空字符串。解决方案已更新为使用负数。你可以用
re.sub(“\(|\),”,s)删除括号。
你能修改你的答案以包含负数的处理吗?你能修改你的答案以包含负数的处理吗?