我经常遇到这样的模式,其中有趣的部分由特定字符界定,其余部分无关紧要。一个典型的例子:
/dev/sda1 472437724 231650856 216764652 52% /
我想通过说出“匹配任何内容来提取52
(也可以是9
或100
-1到3位数字),然后到%
(在该行中是唯一的),请参见前面以提取匹配项。。
我尝试将code this设置为.*(\d*)%.*
,但该组不匹配:
.*
可以匹配任意次数,任意次数的%
...直到到达垃圾%
(\d
也与.*
匹配,但我的理解是一旦%
匹配后,正则表达式引擎将向后工作,因为它现在具有一个“锚” ,可以在此基础上分析以前的内容-请告知这种推理是否正确,谢谢)(\d*)
... ...在此之前,%
您有(\d*)
可以进行匹配和分组.*
...,其余的无所谓(匹配所有内容)答案 0 :(得分:3)
您的正则表达式不起作用,因为.
匹配太多,而组匹配太少。由于\d*
量词,*
组基本上不能匹配 ,而所有内容都与.
匹配。
您对.*
的描述有些不正确。实际上,它匹配所有内容直到结尾,然后向后移动直到它后面的东西((\d*).*
)匹配为止。有关更多信息,请参见here。
事实上,我认为您的文字可以简单地通过以下方式进行匹配:
(\d{1,3})%
加入小组1。
“一直寻找直到找到...”的逻辑已经融入了正则表达式引擎中,因此除非您希望在比赛中使用它,否则无需明确地说出.*
。在这种情况下,您只希望%
前面的数字正确吗?
答案 1 :(得分:2)
如果您只是想提取数字,那么我将使用:
import re
pattern = r"\d*(?=%)"
string = "/dev/sda1 472437724 231650856 216764652 52% /"
returnedMatches = re.findall(pattern, string)
regex表达式对特殊字符很有帮助
答案 2 :(得分:1)
在您的模式中,此部分.*
匹配到字符串的末尾。然后,它会尽可能地放弃放弃,直到它可以匹配数字0+倍和%
。
匹配%
是因为可以匹配0+个数字。然后,您再次匹配.*
直到字符串的结尾。有一个捕获组,只有一个空白。
您可能要做的是在数字前添加单词边界或空格:
.* (\d{1,3})%.*
或.*\b(\d{1,3})%.*
请注意,使用.*
(贪婪)会得到数字的最后一个实例和%
符号。
如果您将其设为非贪婪,则可以匹配第一个匹配项:
.*?(\d{1,3})%.*
答案 3 :(得分:1)
默认情况下,正则表达式尽可能贪婪地匹配。正则表达式序列中的首个.*
匹配所有%
之前的内容:
"/dev/sda1 472437724 231650856 216764652 52"
这对于正则表达式是可接受的,因为它只是选择让下一个模式(\d*)
匹配0个字符。
在这种情况下,您可以使用几个选项。我最建议使用前面的空格来定义一个序列,该序列“以单个空格开头,中间包含任意数量的数字,并以百分比符号结尾”:
' (\d*)%'
答案 4 :(得分:0)