我想做的是仅从美元数字中提取数字。
输入格式
...
$1,289,868
$62,000
$421
...
所需的输出
...
1289868
62000
421
...
我用来仅提取数字和逗号的正则表达式为:
r'\d+(,\d+){0,}'
哪个当然会输出...
...
1,289,868
62,000
421
...
我想做的是将输出转换为整数(int(...)
),但是显然这不适用于逗号。我敢肯定我可以自己解决这个问题,但是我现在的时间很短。
我知道我可以简单地使用r'\d+'
,但这显然将每个块都分成了单独的匹配项...
答案 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]