【问题标题】:Python regex returns a part of the match when used with re.findall与 re.findall 一起使用时,Python 正则表达式返回匹配的一部分
【发布时间】:2015-11-13 08:12:56
【问题描述】:

我一直在尝试自学 Python,目前正在学习正则表达式。我一直在使用的说明性文本似乎旨在教授 Perl 或其他一些不是 Python 的语言,因此我不得不稍微调整表达式以适应 Python。然而,我不是很有经验,而且我在试图让表达发挥作用时遇到了障碍。

问题涉及在文本中搜索价格实例,用不带小数的 $500 或带小数的 $500.10 表示。

这是文中推荐的:

\$[0-9]+(\.[0-9][0-9])?

复制文字,我用这段代码:

import re

inputstring = "$500.01"

result = re.findall( r'\$[0-9]+(\.[0-9][0-9])?', inputstring)

if result:
    print(result)
else:
    print("No match.")

但是,结果不是 $500.01,而是:

.01

我觉得这很奇怪。如果我删除括号和可选的小数部分,它工作正常。所以,使用这个:

\$[0-9]+\.[0-9][0-9]

我明白了:

$500.01

如何让正则表达式返回带小数部分和不带小数部分的值?

谢谢。

【问题讨论】:

  • 现在this是一个关于正则表达式的好问题。
  • Jordan H. 欢迎来到 SO。很高兴看到用户在第一天就发布了一个问题,该问题显示了研究工作,制定良好并符合 SO 准则。

标签: python regex findall


【解决方案1】:

使用非捕获组:

result = re.findall( r'\$[0-9]+(?:\.[0-9][0-9])?', inputstring)
                                ^^ 

re.findall 函数返回捕获的文本列表(如果模式中定义了任何文本,并且您的文本中有一个)。你需要把它变成一个非捕获的来摆脱它。

re.findall(pattern, string, flags=0)
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

更新

您可以通过使用 限制量词 {2} 稍微缩短正则表达式,这需要恰好出现 2 次前面的子模式:

r'\$[0-9]+(?:\.[0-9]{2})?'
                    ^^^

甚至将[0-9] 替换为\d

r'\$\d+(?:\.\d{2})?'

【讨论】:

  • 我还会将看起来多余的[0-9][0-9] 替换为[0-9]{2},因为如果有的话,价格中应该总是有两位小数。
  • 我对您上次的编辑也有同样的想法。不幸的是,我不能多次投票。
  • 您的建议奏效了。另外,我是 stackoverflow 的新手,我意识到评论框中的文字说避免使用此框表示感谢,但我不知道如何表达我的感激之情在这个网站上,所以无论如何我都会说。谢谢。
  • @JordanH:很高兴为您提供帮助。对 SO 表示感谢意味着支持对您有帮助的答案并接受解决您问题的答案。祝你好运。
  • 虽然我想不出现实生活中的案例,但是如果有像“abc$500.01dolar”这样的字符串会发生什么。这个正则表达式仍然会找到“$500.01”。如果您明确希望仅查找空格后以“$”开头的价格并且在第二个小数点后还有空格,则正则表达式还应匹配字符串 ^ 的开头和字符串 $ 的结尾。我不想分裂头发,只是指出OP的一些陷阱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多