怎么说“匹配任何东西直到一个特定的字符,然后往后退”?

时间:2019-08-02 14:23:39

标签: python regex python-3.x

我经常遇到这样的模式,其中有趣的部分由特定字符界定,其余部分无关紧要。一个典型的例子:

/dev/sda1       472437724  231650856 216764652  52% /

我想通过说出“匹配任何内容来提取52(也可以是9100-1到3位数字),然后到%(在该行中是唯一的),请参见前面以提取匹配项。

我尝试将code this设置为.*(\d*)%.*,但该组不匹配:

  • .*可以匹配任意次数,任意次数的
  • % ...直到到达垃圾%\d也与.*匹配,但我的理解是一旦%匹配后,正则表达式引擎将向后工作,因为它现在具有一个“锚” ,可以在此基础上分析以前的内容-请告知这种推理是否正确,谢谢)
  • (\d*) ... ...在此之前,%您有(\d*)可以进行匹配和分组
  • .* ...,其余的无所谓(匹配所有内容)

5 个答案:

答案 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})%.*

Regex demo 1regex demo 2

请注意,使用.*(贪婪)会得到数字的最后一个实例和%符号。

如果您将其设为非贪婪,则可以匹配第一个匹配项:

.*?(\d{1,3})%.*

Regex demo

答案 3 :(得分:1)

默认情况下,正则表达式尽可能贪婪地匹配。正则表达式序列中的首个.*匹配所有%之前的内容:

"/dev/sda1       472437724  231650856 216764652  52"

这对于正则表达式是可接受的,因为它只是选择让下一个模式(\d*)匹配0个字符。

在这种情况下,您可以使用几个选项。我最建议使用前面的空格来定义一个序列,该序列“以单个空格开头,中间包含任意数量的数字,并以百分比符号结尾”:

' (\d*)%'

答案 4 :(得分:0)

尝试一下:

.*(\b\d{1,3}(?=\%)).*

demo