Python正则表达式与unicode字符串无法正常工作

时间:2014-07-04 12:47:50

标签: python regex

我试图从以下字符串中接收价格:

"€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

但接着我收到所有号码,我只想要一个货币背后的数字。

任何可以帮助我的人?​​

3 个答案:

答案 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']