用于在 python 中提取价格的正则表达式和 unicode
Regular expression and unicode to extract a price in python
我正在尝试从宜家网站提取一些价格,但价格格式非常混乱(空格、回车符 return、中间的逗号)。这是我提取的内容:
39,90 €
,
我用 Scrapy 来做这个,到目前为止没问题,除了我想摆脱所有不是价格(和欧元符号)的东西!
我尝试使用这个正则表达式(在 python 2.7 中):
re(\S[0-9]+([ ,]?[ ])([0-9]{2}?)u"\u20AC")
我是编程新手,今天下午我学习了什么是正则表达式,但我尝试了大量的可能性,但没有得到比 :
更好的结果
SyntaxError: unexpected character after line continuation character
如果有人能花几分钟看看我做了什么,并告诉我哪里错了,那就太好了!
大家干杯
您要匹配的字符串类型是 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字符串
正则表达式解释:
- \D* - 任何非数字零次或多次的东西
- (\d+) - 一个或多个数字
- \D* - ...
- (\d{0,2}) - 零位或两位数
- \D* - ...
- (\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 sandwich":
- 在输入时将字节解码为 unicode
- 仅使用 unicode
- 在输出时将 unicode 编码为字节
我正在尝试从宜家网站提取一些价格,但价格格式非常混乱(空格、回车符 return、中间的逗号)。这是我提取的内容:
39,90 €
,
我用 Scrapy 来做这个,到目前为止没问题,除了我想摆脱所有不是价格(和欧元符号)的东西!
我尝试使用这个正则表达式(在 python 2.7 中):
re(\S[0-9]+([ ,]?[ ])([0-9]{2}?)u"\u20AC")
我是编程新手,今天下午我学习了什么是正则表达式,但我尝试了大量的可能性,但没有得到比 :
更好的结果SyntaxError: unexpected character after line continuation character
如果有人能花几分钟看看我做了什么,并告诉我哪里错了,那就太好了!
大家干杯
您要匹配的字符串类型是 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字符串
正则表达式解释:
- \D* - 任何非数字零次或多次的东西
- (\d+) - 一个或多个数字
- \D* - ...
- (\d{0,2}) - 零位或两位数
- \D* - ...
- (\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 sandwich":
- 在输入时将字节解码为 unicode
- 仅使用 unicode
- 在输出时将 unicode 编码为字节