1

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

        39,90 €
                            ,

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

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

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

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

SyntaxError: unexpected character after line continuation character

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

大家干杯

4

1 回答 1

1

您尝试匹配 unicode 或字节的字符串类型是什么?

假设您正在使用 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 货币符号

我们使用 \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. 在输入时将字节解码为 un​​icode
  2. 仅使用 unicode
  3. 在输出时将 unicode 编码为字节
于 2015-12-05T20:49:14.750 回答