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 起来了??
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.
关于这个问题,我正在尝试 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 起来了??
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.