Skip to main content
 首页 » 编程设计

python之非贪婪正则表达式未按预期匹配

2025年05月04日24tuyile006

给定以下字符串作为输入:

[2015/06/09 14:21:59] mod=syn|cli=192.168.1.99/49244|srv=192.168.1.100/80|subj=cli|os=Windows 7 or 8|dist=0|params=none|raw_sig=4:128+0:0:1460:8192,8:mss,nop,ws,nop,nop,sok:df,id+:0 

我正在尝试匹配 subj 的值,即:在上述情况下,预期输出将是 cli

我不明白为什么我的正则表达式不起作用:

subj = re.match(r"(.*)subj=(.*?)|(.*)", line).group(2) 

据我所知,这里的第二组应该是 cli 但我得到的结果是空的。

请您参考如下方法:

|在正则表达式中具有特殊含义(创建 alternations ),因此将其转义为

>> re.match(r"(.*)subj=(.*?)\|", line).group(2) 
'cli' 

另一种解决方案

您可以使用 re.search() 这样你就可以去掉 subj 开头的组在|之后

示例

>>> re.search(r"subj=(.*?)\|", line).group(1) 
'cli' 

这里我们使用group(1)因为只有一组被捕获,而不是以前版本中的三个。


复杂版

如果您使用 look arounds,您甚至可以摆脱所有捕获

>>> re.search(r"(?<=subj=).*?(?=\|)", line).group(0) 
'cli' 
  • (?<=subj=)检查字符串是否与 .*? 匹配前面是subj .

  • .*?匹配任何东西,非贪婪匹配。

  • (?=\|)检查此anything 是否后跟 | .