【问题标题】:Regular Expression re.sub not detecting all matches正则表达式 re.sub 未检测到所有匹配项
【发布时间】:2015-04-30 00:01:47
【问题描述】:

我一直在尝试使用正则表达式从文本中检索百分比。遗憾的是,使用 .sub 并不能检索所有匹配项。

data = "Tho grades of the two students improved by 5.2% and 6.2%."
re_1 = re.compile(r"\b(\d+\.)?\d+(%|(\spercent))")
data = re.sub(re_1, "__PERCENTAGE__", data, re.I)

我正在尝试检索以下内容:“5%”、“20.2%”、“5%”、“5.2%”。 作为匹配的一部分的单词百分比和百分比符号很好,但我怀疑问题来自重叠。输入上述数据时,当前输出为:

"The grades of the two students improved by __PERCENTAGE__ and 6.2%."

关于如何确保两个百分比都匹配的任何提示? 非常感谢。

PS:可能是相关的,我使用的是 Python 3

【问题讨论】:

  • 您似乎没有使用g 标志来替换字符串中的所有匹配项。
  • 对我来说很好用!
  • 顺便说一句,最好写\d+(?:\.\d+)? 而不是(?:\d+\.)?\d+,因为即使没有小数点,左侧的所有数字也会一劳永逸地匹配。当没有小数点时,该组立即失败。
  • 看起来这行得通。 regexr.com/3atik

标签: regex python-3.x


【解决方案1】:

您可能遇到的问题与 u 在不同 Python 3 版本中的处理方式有关。此外,您将编译的正则表达式对象传递给re.sub,而只有字符串模式应作为第一个参数传递。

import re
p = re.compile(r'(\b\d+(?:\.\d+)?(?:\spercent|\%))')
test_str = "The grades of the two students improved by 5.2% and 5.4% it was 5 percent or 1.2%."
result = re.sub(p, "__PERCENTAGE__", test_str)
print (result)

IDEONE Demo(使用Python 3.4)中,代码编译良好并输出

The grades of the two students improved by __PERCENTAGE__ and __PERCENTAGE__ it was __PERCENTAGE__ or __PERCENTAGE__.

【讨论】:

  • 啊,是的,可能是这样。感谢您对已编译的正则表达式的提醒。我注意到只有前两个匹配项匹配。 Ideone Code 当我删除数据中前两个百分比中的一个时,它将匹配下一个百分比,但如果我不删除,则只匹配前两个。
  • 请查看更新。我主要是对 Python 3 字符串中具有特定含义的% 进行转义。
猜你喜欢
  • 2022-11-29
  • 2021-09-24
  • 1970-01-01
  • 2021-10-12
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多