Python正则表达式-Ungreedy量词问题
我把前面的一个问题搞砸了,把它删掉了(提供了一个导致错误答案的糟糕例子)。罪过 这又是一次,说得更正确。我还需要介绍2不是字符串的第一个字符的情况 我有这个字符串:Python正则表达式-Ungreedy量词问题,python,regex,regex-greedy,Python,Regex,Regex Greedy,我把前面的一个问题搞砸了,把它删掉了(提供了一个导致错误答案的糟糕例子)。罪过 这又是一次,说得更正确。我还需要介绍2不是字符串的第一个字符的情况 我有这个字符串: bobsmith2kgminus10meshcompt3kgfredrogers 我只想返回2 这是我的正则表达式: .*(\d+?)kg.* 它正在返回3,我看不出我错过了什么 我的python代码: import re val = 'bobsmith2kgminus10meshcompt3kgfredrogers' out
bobsmith2kgminus10meshcompt3kgfredrogers
我只想返回2
这是我的正则表达式:
.*(\d+?)kg.*
它正在返回3
,我看不出我错过了什么
我的python代码:
import re
val = 'bobsmith2kgminus10meshcompt3kgfredrogers'
out = re.sub(r'.*(\d+?)kg.*', r'\1', val)
print(out) #prints: 3
我也试过:
(.*)(\d+?)kg.*
(\d+?)kg.*
如果您确实想使用
re.sub
,请使用:
.*?(\d+)kg.*
这将尽可能减少0个或更多字符的次数,在匹配和分组之前根据需要展开\d+
代码:
>>> import re
>>> val = 'bobsmith2kgminus10meshcompt3kgfredrogers'
>>> print ( re.sub(r'.*?(\d+)kg.*', r'\1', val) )
2
>>> print ( re.search(r'(\d+)kg', val).group(1) )
2
否则,您可以在
re.search
中使用这个更简单的正则表达式:
(\d+)kg
代码:
>>> import re
>>> val = 'bobsmith2kgminus10meshcompt3kgfredrogers'
>>> print ( re.sub(r'.*?(\d+)kg.*', r'\1', val) )
2
>>> print ( re.search(r'(\d+)kg', val).group(1) )
2
我的猜测是,这个表达式可能只起作用:
(\d+)kg.*
试验
输出
或使用re.sub
:
import re
regex = r".*?(\d+)kg.*"
test_str = """
2kgminus10meshcomp3kg
some_content_before200kgminus10meshcomp3kg
"""
subst = "\\1"
print(re.sub(regex, subst, test_str))
您只想匹配第一个数量,单位为kg,对吗??使前面的量词变懒,从而使正则表达式匹配尽可能少的数字。这并不意味着比赛会更少,但比赛将是尽可能最小的。你明白了,这是有效的。但是你能给我解释一下为什么捕获组之后的
?
不起作用吗?从我对ungreedy量词的不太深入的理解来看,捕获组应该是ungreedy。。。(即,在第一个之后停止)?我添加了一个解释。在\d+
之后使用惰性量词不会有任何区别,因为regex在这之前已经使用*
使用了最长的匹配项?使前面的量词变懒,从而使正则表达式匹配尽可能少的数字。这并不意味着将减少匹配,但匹配将尽可能小。我感谢您提供有关findall
的额外信息-非常感谢+2.