用于匹配字符串Python的正则表达式

时间:2013-06-20 12:03:32

标签: python regex

我想匹配字符串的数值:

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条款的提示?

5 个答案:

答案 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']

演示:http://rubular.com/r/UomzIY3SD3

答案 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)

试试这个正则表达式:

(\$?\d+(?:[,.]?\d*(?:\.\d+)?)).*?

Live demo

答案 3 :(得分:0)

为什么要对正则表达式进行分组?试试这个r'\$?\d+,?\d*\.?\d*'

答案 4 :(得分:0)

我会试试这个正则表达式:

R '[0-9] +(:,[0-9] +)(?:[0-9] )?'

添加\ $?在开始时可选择捕获$