【问题标题】:Regex for prices with euros pounds and dollars正则表达式与欧元英镑和美元的价格
【发布时间】:2015-07-09 16:54:47
【问题描述】:

我正在使用 python 正则表达式来查找字符串中的所有价格。到目前为止,我只是在正确管理符号时遇到了麻烦。 这段代码,输入:'happy$37.54000happy$34$3454$3333€27.80€3.00.33.2£27.000'

   import sys
   import re
   price = sys.argv[1]
   new = re.findall(r'[\$\20AC\00A3]{1}\d+\.?\d{0,2}',price,re.UNICODE)
   for prices in new:
       print prices

输出:

$37.54
$34
$3454    
$3333

我想要的是:

$37.54
$34
$3454
$3333
€27.80
€3.00    
£27.00

如果我将欧元符号添加到代码中,则文件无法编译,因为它不是 unicode 字符。我在想,因为20AC 是欧元符号的 unicode,\00A3 是英镑符号的 unicode,所以它可以工作,但它没有。

我认为问题在于这部分代码:...

[\$\20AC\00A3]...

任何帮助将不胜感激

为未来的人编辑 - 这是最好的代码答案:

# -*- coding: utf-8 -*-
import sys
import re
price = sys.argv[1]
new = re.findall(r'[$€£]{1}\d+\.?\d{0,2}',price,re.UNICODE)
for prices in new:
    print prices

【问题讨论】:

  • 假设句点后面总是跟着两位数字是否安全?
  • 如果将r' 更改为ur' 会怎样?
  • 感谢kirby的建议,可惜没用。
  • 谢谢 Jason,说得好,我已将其更改为 [\$\20AC\00A3]{1}\d+\.?\d{2}? (这并不能解决问题,但我认为从长远来看是更好的代码)

标签: python regex unicode


【解决方案1】:

这是一个与您的示例匹配的正则表达式。

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

值得注意的是,我假设句号后面会跟着两个数字。所以这将匹配 3.50 但忽略 3.5。如果不需要这种行为,您需要将正则表达式调整为

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

在我的示例中会选择 3.5。

【讨论】:

  • 我尝试过类似的方法,但我遇到了这个错误:SyntaxError: Non-ASCII character '\xe2' .... 你是否导入了知道如何处理 €£ 字符的东西?还是您使用了我的 re.UNICODE 标志之外的其他标志?
  • 我对 python 中的字符编码问题没有任何经验,但也许这个答案会有所帮助? stackoverflow.com/a/24221963/3442448
  • 行得通!谢谢你。 (在文件顶部添加:# -- coding: utf-8 --)
  • 不错!永远不要低估谷歌搜索错误消息的力量。 :)
【解决方案2】:

您需要在正则表达式中为您的 unicode 字符代码添加 \u。即

new = re.findall(ur'[\$\u20AC\u00A3]{1}\d+\.?\d{0,2}',string,re.UNICODE)

https://docs.python.org/2/tutorial/introduction.html#unicode-strings

【讨论】:

  • 谢谢,这回答了符号问题。它不是完美的代码,因为它输出: $37.54 000 $34 $3454 $3333 27.80 00.33 27.00 ,但它回答了这个问题。谢谢
  • 我修好了。现在它也匹配字符。您需要以 unicode 格式指定您的正则表达式(带有 u 前缀)。
【解决方案3】:

我可以直接匹配符号

[\$|€|£\20AC\00A3]{1}\d+.?\d{0,2}

http://pythex.org

【讨论】:

  • 奇怪的是,我的命令行输出: SyntaxError: Non-ASCII character '\xe2' 。但是感谢您的反馈,这个网站将来会有所帮助。 (很抱歉我还不能在这个网站上投票)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
相关资源
最近更新 更多