我想匹配字符串的数值:
1,000 metric tonnes per contract month
Five cents ($0.05) per tonne
Five cents ($0.05) per tonne
1,000 metric tonnes per contract month
我目前的做法:
size = re.findall(r'(\d+(,?\d*).*?)', my_string)
我的方法得到了什么:
print size
[(u'1,000', u',000')]
正如您所看到的,数字1
正从列表的第二个元素中删除,为什么会这样?另外,我是否可以获得有关如何匹配$0.05
条款的提示?
答案 0 :(得分:3)
这样的事情:
>>> import re
>>> strs = """1,000 metric tonnes per contract month
Five cents ($0.05) per tonne
Five cents ($0.05) per tonne
1,000 metric tonnes per contract month"""
>>> [m.group(0) for m in re.finditer(r'\$?\d+([,.]\d+)?', strs)]
['1,000', '$0.05', '$0.05', '1,000']
答案 1 :(得分:3)
re,findall()
返回每个匹配的所有捕获组的元组,每组正常括号生成一个这样的组。写这样的正则表达式:
size = re.findall(r'\d{1,3}(?:,\d{3})*(?:\.\d+)?', my_string)
<强>解释强>
\d{1,3} # One to three digits
(?:,\d{3})* # Optional thousands groups
(?:\.\d+)? # Optional decimal part
这假设所有数字都有逗号作为千位分隔符,i。即没有像1000000
这样的数字。如果您还需要匹配,请使用
size = re.findall(r'\d+(?:,\d{3})*(?:\.\d+)?', my_string)
答案 2 :(得分:0)
答案 3 :(得分:0)
为什么要对正则表达式进行分组?试试这个r'\$?\d+,?\d*\.?\d*'
答案 4 :(得分:0)
我会试试这个正则表达式:
R '[0-9] +(:,[0-9] +)(?:[0-9] )?'
添加\ $?在开始时可选择捕获$