Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式(从字符串中提取货币值)_Python_Regex - Fatal编程技术网

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')