4

我想匹配一个字符串的数值:

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

4

5 回答 5

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

于 2013-06-20T12:07:48.370 回答
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

这假设所有数字都有逗号作为千位分隔符,即没有像1000000. 如果您也需要匹配这些,请使用

size = re.findall(r'\d+(?:,\d{3})*(?:\.\d+)?', my_string)
于 2013-06-20T12:08:19.113 回答
0

试试这个正则表达式:

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

现场演示

于 2013-06-20T12:12:06.010 回答
0

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

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

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

于 2013-06-20T12:36:36.950 回答
0

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

于 2013-06-20T12:19:23.897 回答