2012-01-12 78 views
3

我改写(munging)包含以下形式的字符串数据:Python的正则表达式(提取从字符串货币价值)

" The little £250,000 brown fox jumped over the lazy dog" 

[澄清]

该字符串被转换为一个双五月已经被“清洗”已经和可能只是看起来像这样:

"£250,000" 

我设法破解一起粗功能,即地强迫一个STR像“250,000英镑”成双倍。然而,当我用一个像上面那样的字符串来呈现字符串的货币部分时,我正努力写一个正则表达式。问题是我不知道我会遇到哪种类型的字符串 - 即“清理”的货币值(如第二个示例)或“脏”字符串(如第一个示例)。我需要编写一个函数来处理这两种类型的字符串,并以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

's = str(s)'在'try'之前会有意义。由于解码仅适用于字符串,并且索引对整数不起作用,所以您可以假设它是'try/except'之后的字符串。否则,你的程序会在'except'内部抛出异常(不会被捕获)。 – FakeRainBrigand 2012-01-12 13:11:15

回答

1

尝试:

re.findall('£{1}[,0-9]{1,10}','The little £250,000 brown fox jumped over the lazy dog') 

然后把比赛的结果并删除逗号。

+0

+1:我在你的完整解决方案中也使用了你的regex表达式来匹配'dirty'字符串 – 2012-01-12 14:46:46

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

+0

我收到以下错误(使用上面的代码片段时):SyntaxError:第140行文件/path/to/myscript.py中的非ASCII字符'\ xc2',但未声明编码;有关详细信息,请参阅http://www.python.org/peps/pep-0263.html。我会检查URL的详细信息 – 2012-01-12 13:17:06

+0

@HomunculusReticulli:把'# - * - coding:utf-8 - * - '放在文件的顶部。这告诉Python解释器关于源文件的编码。 – 2012-01-12 13:18:09

+0

谢谢修复那个错误。但是,我需要澄清的是,我需要能够匹配像'£250,000'这样的字符串(没有其他文字围绕monetray值)。 – 2012-01-12 13:25:41

0

如果输入文本可以使用各种语言,则需要担心不同语言环境的标点差异。

在某些地区,您称之为“250,000英镑”将会是“250.000英镑”,反之亦然:“0.50英镑”可以写成“£0.50”。有可能更多的品种。

忽略这一点,我想你应该用正则表达式来处理你的例子,比如r"£[0-9,.]+"