我试图从以下字符串中接收价格:
"€29,95 ipv€69,95 - ezCast M2 Original"
使用以下正则表达式:
[\$\£\€](\d+(?:.\d{1,2})?)
根据正则表达式测试人员的说法,上面的正则表达式工作得很好(我收到29,95和69,95没有货币,所以这很好)......但是在python中它并没有。我认为这是因为python unicodes字符串。因为如果我在屏幕上打印字符串,我会得到:
[u'\u20ac29,95 ipv \u20ac69,95 \u2013 ezCast M2 Original']
我尝试了以下代码:
p = re.findall('[\$\£\€](\d+(?:.\d{1,2})?)',str(prices))
p = re.findall(u'[\$\£\€](\d+(?:.\d{1,2})?)',str(prices))
p = re.findall(ur'[\$\£\€](\d+(?:.\d{1,2})?)',str(prices))
p = re.findall(r'[\$\£\€](\d+(?:.\d{1,2})?)',str(prices))
这些都不是...... 但是下面的那个工作:
p = re.compile('(\d+(?:.\d{1,2})?)')
#
for m in p.findall(str(prices)):
print m
但接着我收到所有号码,我只想要一个货币背后的数字。
任何可以帮助我的人?
答案 0 :(得分:2)
通过解码将字符串转换为unicode。
>>> prices = "€29,95 ipv €69,95 ezCast M2 Original "
>>> re.findall(ur'[\$\\€](\d+(?:.\d{1,2})?)', prices.decode('utf-8'))
[u'29,95', u'69,95']
答案 1 :(得分:0)
您可以使用此正则表达式:
.*?(\d+,\d+).*?ipv.*?(\d+,\d+).*?
它忽略了€符号并依赖于“ipv”分隔符。 你必须得到\ 1和\ 2元素
答案 2 :(得分:0)
您需要encode
字符串:
>>> prices = u'\u20ac29,95 ipv \u20ac69,95 \u2013 ezCast M2 Original'
>>> p = re.findall('[\$\£\€](\d+(?:.\d{1,2})?)',prices.encode('utf8'))
>>> p
['29,95', '69,95']