带unicode字符串的Python正则表达式不起作用

2024-06-14 13:06:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从以下字符串接收价格:

“€29,95 ipv€69,95–ezCast M2原件”

使用以下正则表达式:

[\$\£\€](\d+(?:.\d{1,2})?)

根据regex测试人员,上面的regex工作正常(我收到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

但是我收到了所有的数字,我只想要一种货币后面的数字。你知道吗

有人能帮我吗?你知道吗


Tags: 字符串re货币价格数字regex原件prices
3条回答

通过解码将字符串转换为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']

您可以使用以下正则表达式:

.*?(\d+,\d+).*?ipv.*?(\d+,\d+).*?

它忽略了符号并依赖于“ipv”分隔符。 必须获得\1和\2元素

您需要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']

相关问题 更多 >