Python正则表达式(从字符串中提取货币值)
我正在搜索包含以下格式字符串的数据:Python正则表达式(从字符串中提取货币值),python,regex,Python,Regex,我正在搜索包含以下格式字符串的数据: " The little £250,000 brown fox jumped over the lazy dog" [澄清] 要转换为double的字符串可能已经被“清理”了,可能只是如下所示: "£250,000" 我设法拼凑出一个粗糙的函数,它将一个像“250000英镑”这样的字符串敲打成一个双精度。然而,当我看到一个像上面那样的字符串时,我却无计可施地编写一个正则表达式来搜索字符串的货币部分。问题是,我不知道会遇到哪种类型的字符串,即“已清理”货
" The little £250,000 brown fox jumped over the lazy dog"
[澄清]
要转换为double的字符串可能已经被“清理”了,可能只是如下所示:
"£250,000"
我设法拼凑出一个粗糙的函数,它将一个像“250000英镑”这样的字符串敲打成一个双精度。然而,当我看到一个像上面那样的字符串时,我却无计可施地编写一个正则表达式来搜索字符串的货币部分。问题是,我不知道会遇到哪种类型的字符串,即“已清理”货币值(如第二个示例)或“脏”字符串(如第一个示例)。我需要编写一个函数来处理这两种类型的字符串,并将货币字符串作为double返回
对于“脏”字符串,是否有人可以建议如何匹配货币值(预计最小值为1英镑,预计最大值为9999999英镑)。另外,如果有一种更像蟒蛇的方式来编写下面的函数,我想听听蟒蛇学者的建议
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)
将匹配货币表达式,例如
>>> 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('\xc2\xa3250,000'.decode('utf-8')[1:].strip(','))
Decimal('250000')
(假设UTF-8。)尝试:
re.findall('£{1}[,0-9]{1,10}','The little £250,000 brown fox jumped over the lazy dog')
然后获取匹配结果并去掉逗号。如果输入文本可以使用不同的语言,则需要担心不同地区的标点符号会有差异 在某些地区,你所谓的“250000英镑”将是“250000英镑”,分数则是“0.50英镑”可以写成“0,50英镑”。可能有更多的品种
忽略这一点,您的示例应该由正则表达式处理,例如
r“[0-9,.]+”
,我想。s=str(s)
在尝试之前是有意义的。由于decode只对字符串起作用,而索引对整数不起作用,因此可以假定它是try/except
之后的字符串。否则,您的程序将在中抛出异常,但
除外(不会被捕获)。我得到以下错误(使用上述代码段时):SyntaxError:file/path/to/myscript.py第140行的非ASCII字符“\xc2”,但未声明编码;有关详细信息,请参阅。我将检查URL是否存在错误details@HomunculusReticulli:将#-*-编码:utf-8-*-
放在文件的顶部。这将告诉Python解释器源文件的编码。感谢您修复了该错误。不过,我需要澄清一下,我还需要能够匹配像“250000英镑”这样的字符串(monetray值周围没有其他文本)。@HomunculusReticulli:那么<代码>重新匹配(r'.\d{1,3}(?:\,\d{3})+(?:\。\d{2})',“.250000”)
有效,不是吗?我希望它匹配-但它没有。我一定是做错事了。我将检查并重试。+1:我在完整的解决方案中也使用了您的正则表达式,以匹配“脏”字符串
re.findall('£{1}[,0-9]{1,10}','The little £250,000 brown fox jumped over the lazy dog')