从美元数字中仅提取数字

时间:2018-07-21 19:14:12

标签: python regex

我想做的是仅从美元数字中提取数字。

输入格式

...
$1,289,868
$62,000
$421
...

所需的输出

...
1289868
62000
421
...



我用来仅提取数字和逗号的正则表达式为:

r'\d+(,\d+){0,}'

哪个当然会输出...

...
1,289,868
62,000
421
...

我想做的是将输出转换为整数(int(...)),但是显然这不适用于逗号。我敢肯定我可以自己解决这个问题,但是我现在的时间很短。

我知道我可以简单地使用r'\d+',但这显然将每个块都分成了单独的匹配项...

5 个答案:

答案 0 :(得分:6)

您不能在一个匹配操作中匹配不连续的文本。您不能将re.findall的正则表达式放入1,345,456中以接收1345456。您需要首先匹配所需的字符串,然后在代码中对其进行后处理。

您可以用来提取数字的正则表达式

re.findall(r'\$(\d{1,3}(?:,\d{3})*)', s)

请参见this regex demo

或者,您可以使用更通用的正则表达式来与re.findall一起使用:

r'\$(\d+(?:,\d+)*)'

请参见this regex demo

请注意,re.findall仅返回捕获的字符串部分(与正则表达式中的(...)部分匹配的那个部分)。

详细信息

  • \$-一个美元符号
  • (\d{1,3}(?:,\d{3})*)-捕获组1:
    • \d{1,3}-1至3位数字(如果使用\d+,则为1位或更多位数字)
    • (?:,\d{3})*-0个或多个序列
      • ,-逗号
      • \d{3}-3位数字(如果使用\d+,则为1位或更多数字)。

Python code sample(删除逗号):

import re
s = """$1,289,868
$62,000
$421"""
result = [x.replace(",", "") for x in re.findall(r'\$(\d{1,3}(?:,\d{3})*)', s)]
print(result) # => ['1289868', '62000', '421']

答案 1 :(得分:3)

使用re.sub

例如:

import re
s = """$1,289,868
$62,000
$421"""

print([int(i) for i in re.sub(r'[^0-9\s]', "", s).splitlines()])

输出:

[1289868, 62000, 421]

答案 2 :(得分:2)

您不需要正则表达式。

int(''.join(filter(str.isdigit, "$1,000,000")))

工作正常。

如果由于某些原因您确实想使用正则表达式:

int(''.join(re.findall(r"\d", "$1,000,000")))

答案 3 :(得分:1)

如果您知道如何使用逗号分组提取数字,那么最简单的方法就是将其转换为int可以处理的内容:

for match in matches:
    i = int(match.replace(',', ''))

例如,如果match'1,289,868',则match.replace(',', '')'1289868',显然int(<that>)1289868

答案 4 :(得分:0)

您不需要正则表达式。只需字符串操作就足够了

>>> string = '$1,289,868\n$62,000\n$421'
>>> [w.lstrip('$').replace(',', '') for w in string.splitlines()]
['1289868', '62000', '421']

或者,您也可以使用locale.atoi将带逗号的数字字符串转换为int

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF8')
>>> list(map(lambda x: locale.atoi(x.lstrip('$')), string.splitlines()))
[1289868, 62000, 421]