正则表达式和unicode在python中提取价格

时间:2015-12-05 18:52:35

标签: python regex unicode euro

我正试图从宜家网站上提取一些价格,但价格格式非常混乱(空格,回车,中间的逗号)。这就是我提取的内容:

        39,90 €
                            ,

我用Scrapy做到这一点,到目前为止没问题,除了我想摆脱所有不是价格(和欧元符号)!

我尝试使用这个正则表达式(在python 2.7中):

re(\S[0-9]+([ ,]?[ ])([0-9]{2}?)u"\u20AC")

我是编程新手,今天下午我学会了什么是正则表达式,但我尝试了大量的可能性而没有得到比以下更好的结果:

SyntaxError: unexpected character after line continuation character

如果有人花几分钟时间看看我做了什么并告诉我哪里出错了,那就太棒了!

为每个人欢呼

1 个答案:

答案 0 :(得分:1)

您尝试匹配unicode或byte的字符串类型?

假设您正在使用unicode字符串,那么您的匹配可能如下所示:

#!/usr/bin/python
import re

s = u"""        39,90 \u20AC
                  """
groups = re.match(ur'\D*(\d+)\D*(\d{0,2})\D*(\u20AC)', s, re.UNICODE)
print groups.groups()

输出:

(u'39', u'90', u'\u20ac')
字符串前面的

u 表示这是unicode字符串。

正则表达式解释说:

  1. \ D * - 任何非零数字或更多次的数字
  2. (\ d +) - 一个或多个数字
  3. \ D * - ...
  4. (\ d {0,2}) - 零或两位数
  5. \ D * - ...
  6. (\ u20AC) - unicode货币符号
  7. 我们使用\ D,\ d和re.UNICODE标志,以便将unicode中的所有内容都解释为数字或非数字。

    如果使用字节字符串。我假设您正在使用utf-8字节字符串。然后:

    import re
    
    s = b"""        39,90 \xE2\x82\xAC
                      """
    
    groups = re.match(r'\D*(\d+)\D*(\d{0,2})\D*(\xE2\x82\xAC)', s)
    print groups.groups()
    

    输出:

    ('39', '90', '\xe2\x82\xac')
    

    “\ xe2 \ x82 \ xac”是“e282ac”字节序列,在utf-8编码中表示欧元符号。

    称为“Unicode三明治”的良好做法:

    1. 在输入
    2. 上解码字节为unicode
    3. 仅使用unicode
    4. 将unicode编码为输出上的字节