Python正则表达式-不合宜的量词问题

时间:2019-08-02 17:51:57

标签: python regex regex-greedy

我弄乱了一个较早的问题并将其删除(提供了一个错误的示例,导致了错误的解决方案)。 Mea Culpa

在此再次说明,更正确。 我还需要介绍2不是字符串的第一个字符的情况。

我有这个字符串:

bobsmith2kgminus10meshcompt3kgfredrogers

我只希望返回2

这是我的正则表达式:

.*(\d+?)kg.*

它正在返回3,但我看不到我错过的一切。

RegEx101.com Demo

我的python代码:

import re
val = 'bobsmith2kgminus10meshcompt3kgfredrogers'
out = re.sub(r'.*(\d+?)kg.*', r'\1', val)
print(out) #prints: 3

我也尝试过:

(.*)(\d+?)kg.*
(\d+?)kg.*

2 个答案:

答案 0 :(得分:1)

如果您确实要使用re.sub,请使用:

.*?(\d+)kg.*

这将尽可能减少0个或更多字符,并在匹配和分组\d+之前根据需要扩展。

代码:

>>> import re
>>> val = 'bobsmith2kgminus10meshcompt3kgfredrogers'
>>> print ( re.sub(r'.*?(\d+)kg.*', r'\1', val) )
2

RegEx Demo


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

(\d+)kg

代码:

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

答案 1 :(得分:1)

我的猜测是,该表达式可能简单地起作用:

(\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))