Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式-Ungreedy量词问题_Python_Regex_Regex Greedy - Fatal编程技术网

Python正则表达式-Ungreedy量词问题

Python正则表达式-Ungreedy量词问题,python,regex,regex-greedy,Python,Regex,Regex Greedy,我把前面的一个问题搞砸了,把它删掉了(提供了一个导致错误答案的糟糕例子)。罪过 这又是一次,说得更正确。我还需要介绍2不是字符串的第一个字符的情况 我有这个字符串: bobsmith2kgminus10meshcompt3kgfredrogers 我只想返回2 这是我的正则表达式: .*(\d+?)kg.* 它正在返回3,我看不出我错过了什么 我的python代码: import re val = 'bobsmith2kgminus10meshcompt3kgfredrogers' out

我把前面的一个问题搞砸了,把它删掉了(提供了一个导致错误答案的糟糕例子)。罪过

这又是一次,说得更正确。我还需要介绍2不是字符串的第一个字符的情况

我有这个字符串:

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.