Python 正则表达式 - 不贪婪的量词问题

Python regex - Ungreedy quantifier question

我搞砸了一个较早的问题并将其删除(提供了一个导致错误解决方案的糟糕示例)。 我认罪

又来了,说得更准确了。 我还需要涵盖 2 不是字符串第一个字符的情况。

我有这个字符串:

bobsmith2kgminus10meshcompt3kgfredrogers

我只想 return 2

这是我的正则表达式:

.*(\d+?)kg.*

正在 returning 3,但我没有看到我错过了什么。

RegEx101.com Demo

我的python代码:

import re
val = 'bobsmith2kgminus10meshcompt3kgfredrogers'
out = re.sub(r'.*(\d+?)kg.*', r'', 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'', val) )
2

RegEx Demo


否则,您可以在 re.search 中使用这个更简单的正则表达式:

(\d+)kg

代码:

>>> print ( re.search(r'(\d+)kg', val).group(1) )
2

我的猜测是这个表达式可能会起作用:

(\d+)kg.*

Demo

测试

import re

regex = r"(\d+)kg.*"

test_str = """
2kgminus10meshcomp3kg
some_content_before200kgminus10meshcomp3kg
"""
print(re.findall(regex, test_str))

输出

['2', '200']

re.sub:

import re

regex = r".*?(\d+)kg.*"

test_str = """
2kgminus10meshcomp3kg
some_content_before200kgminus10meshcomp3kg
"""
subst = "\1"
print(re.sub(regex, subst, test_str))