我正在修改包含以下形式字符串的数据:
" The little £250,000 brown fox jumped over the lazy dog"
[澄清]
要转换为double的字符串可能已经“清理”过了,可能只是这样:
"£250,000"
我设法将一个粗略的功能组合在一起,将像“25万英镑”这样的字符串打成一个双重字符串。但是,当我看到一个像上面那样的字符串时,我正在努力写一个正则表达式来理解字符串的货币部分。问题是我不知道我将遇到哪种类型的字符串 - 即“清理”货币值(如第二个示例)或“脏”字符串(如第一个示例)。我需要编写一个函数来处理两种类型的字符串,并将货币字符串作为double返回。
对于'脏'字符串,有人可以推荐如何模式匹配货币值(预期最低值:£1,预期最高£99,999,999)。另外,如果有更多pythonic方式编写下面的函数,我想听听Pythonistas的建议。
non_numeric = re.compile(r'[^0-9\.]+')
def string_to_decimal(s):
try:
s= s.decode('ascii')
except:
s = s[1:] # Assumption is that s begings with currency symbol
s = str(s) # Probably superfulous?
s = s.replace(',','')
s = non_numeric.sub('', str(s))
return decimal.Decimal(s)
答案 0 :(得分:2)
r'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?'
将匹配货币表达式,例如
>>> re.findall(r'£\d{1,3}(?:\,\d{3})+(?:\.\d{2})?',
... " The little £250,000 brown fox jumped over the lazy dog")
['\xc2\xa3250,000']
您可以使用
将结果值转换为Decimal
>>> Decimal('\xc2\xa3250,000'.decode('utf-8')[1:].strip(','))
Decimal('250000')
(假设是UTF-8。)
答案 1 :(得分:1)
尝试:
re.findall('£{1}[,0-9]{1,10}','The little £250,000 brown fox jumped over the lazy dog')
然后取出比赛结果并删除逗号。
答案 2 :(得分:0)
如果输入文本可以使用各种语言,则需要担心不同语言环境中标点符号的差异。
你所谓的“£250,000”在某些语言环境中会是“£250.000”,反之亦然:“£0.50”可以写成“£0,50”。可能有更多的品种。
忽略这一点,我想你的例子应该用正则表达式来处理,例如r"£[0-9,.]+"
。