【问题标题】:Python regex - greedy quantifier not working in all casesPython regex - 贪婪的量词在所有情况下都不起作用
【发布时间】:2019-08-06 22:59:11
【问题描述】:

关于这个问题,我试图隔离/返回x(乘号)之前的第一个 int 或 float。

这是我的测试字符串:

2 x 3 kg PPG etc #returns 2
bob 2 x 3 kg PPG etc #returns 2
1.5x1.5kgPPGetcFred #returns 1.5
BobFred1.5x1.5kgPPGetcFred #returns 1.5
1.5 x 2.3 kg PPG Fred Bob #returns 5 (should return 1.5)
bob Fred 1.5 x 2.3 kg PPG Fred Bob #returns 5 (should return 1.5)

这是我的正则表达式:

.*?(\d+)(\.?)(\s*)(\d?)(x)(.*)

它适用于上述所有测试字符串除了最后两个。沃斯起来了??

RegEx101 Demo

Python 代码示例:

import re

regex = r'.*?(\d+)(\.?)(\s*)(\d?)(x)(.*)'
regout = r'\1\2\4'
test_str = "1.5 x 2.3 kg PPG Fred Bob"

tmp = re.sub(regex, regout, test_str)
print(tmp)

【问题讨论】:

  • 我可以做到:(\d*\.?\d+)\s*(?=x)
  • 嗨 guijob - 谢谢。我刚刚使用上面发布的RegEx101 demo 尝试了您的正则表达式,但它似乎不起作用。你介意编辑/分叉演示并展示它应该如何修改才能工作吗?
  • @guijob - 没关系,I got it: .*?(\d*\.?\d+)\s*(?=x).* 请将您的评论变成答案,以便我接受它是正确的。

标签: python regex regex-greedy


【解决方案1】:

要匹配x 前带有点的数字,您可以使用此正则表达式:(\d*\.?\d+)\s*(?=x)

  • (\d*\.?\d+) 在点之间创建一个数字组,例如:1、10、1.3、1.5、22.10 等。
  • \s* 匹配空格零到无限次(数字和 x 之间可以有空格)
  • (?=x) 确保一切都在x 之前

如果您想使用.sub(),那么您必须匹配整个字符串,这可以使用.*?(\d*\.?\d+)\s*(?=x).* 来完成,就像您在 cmets 中提到的那样。


编辑:OP 在x 之后要求匹配号码。

为此,它几乎是之前正则表达式的逆项,但不是使用正向前瞻(?=),而是使用正向后向(?<=)。因此,当您使用 (?<=x) 时,您要确保所有内容都在 x 之后。

有了这个,你可以使用(?<=x)\s*?(\d*\.?\d+)来匹配,对于.sub()你可以.*?(?<=x)\s*?(\d*\.?\d+).*

regex101 here 的链接。

【讨论】:

  • 非常感谢您的回答和帮助 - 还有一个快速的问题:接下来我如何才能仅捕获 x 之后的数字?
【解决方案2】:

我的猜测是你可能想要设计一个可能类似于:

(\d*(?:\.\d+)?)\s*x\s*(\d*(?:\.\d+)?)

假设 .05 是一个有效数字。

测试

import re

regex = r"(\d*(?:\.\d+)?)\s*x\s*(\d*(?:\.\d+)?)"
test_str = """
2 x 3 kg PPG etc
bob 2 x 3 kg PPG etc
1.5x1.5kgPPGetcFred
BobFred1.5x1.5kgPPGetcFred
1.5 x 2.3 kg PPG Fred Bob
bob Fred 1.5 x 2.3 kg PPG Fred Bob
bob Fred .005 x 2.3 kg PPG Fred Bob
"""

print(re.findall(regex, test_str))

输出

[('2', '3'), ('2', '3'), ('1.5', '1.5'), ('1.5', '1.5'), ('1.5', '2.3'), ('1.5', '2.3'), ('.005', '2.3')]

表达式在regex101.com 的右上方面板中进行了解释,如果您想探索/简化/修改它,在this link 中,您可以查看它如何与一些示例输入进行匹配,如果您愿意的话。

【讨论】:

  • 您好,Emma - 非常感谢您的回答和帮助。另一个快速的问题:接下来我如何才能仅捕获 x 之后的数字?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多