我正在尝试使用Python中的正则表达式从字符串中提取数据。
字符串是“您的第一笔订单优惠15%”。我想从该字符串中提取15。为此,我正在-
import re
pattern = r'.*(\d+)\s*\%.*off.*'
string = '15% Off your first order'
m = re.match(pattern, string, re.I)
print m.group(1)
但是,这返回5
而不是15
。我想念什么?
实际的问题在这里
.*(\d+)
.*
贪婪。因此实际匹配是这样发生的。
r'.*(\d+)\s*\%.*off.*'
.*
首先匹配整个字符串,因为它是贪婪的,并检查是否满足RegEx。由于不满意,它将保留最后一个字符并检查是否与RegEx匹配。因此,它将连续执行此操作并匹配1
并找到(\d+)\s*\%.*off.*
与字符串其余部分匹配的字符串。因此,.*
实际上匹配直到1
并离开\d+
匹配5。这就是为什么它给出的原因5
。像这样将其更改为非贪婪
r'.*?(\d+)\s*\%.*off.*'
现在,.*
由于是非贪婪的?
。因此,它将尽可能地匹配。因此,此处将不匹配任何内容,因为\d+
匹配项为15。
注意:如您所见,它必须迭代尝试所有可能的匹配项。因此它效率很低。你实际上可以这样写
r'.*?(\d+)\s*?\%\s*?off.*'
由于我们到处都使用非贪婪运算符,因此它将比原始贪婪版本更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句