Python 正则表达式 - 贪婪量词并非在所有情况下都有效

Python regex - greedy quantifier not working in all cases

关于这个问题,我正在尝试 isolate/return x(乘号)之前的第一个整数或浮点数。

这是我的测试字符串:

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)(.*)

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

RegEx101 Demo

Python 代码示例:

import re

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

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

我的猜测是您可能想要设计一个类似于以下内容的表达式:

(\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, if you wish to explore/simplify/modify it, and in this link 的右上面板进行了解释,如果您愿意,可以观察它如何与一些示例输入匹配。

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

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

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


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

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

之后

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

Link for regex101 here.