Python 非贪婪正则表达式未按预期匹配
给定以下字符串作为输入:Python 非贪婪正则表达式未按预期匹配,python,regex,Python,Regex,给定以下字符串作为输入: [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 我试图匹配sub的值,即:在上述情况下,预期的输出将是cli 我不明白为什么我的正则表达式不起作用: sub
[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
我试图匹配sub
的值,即:在上述情况下,预期的输出将是cli
我不明白为什么我的正则表达式不起作用:
subj = re.match(r"(.*)subj=(.*?)|(.*)", line).group(2)
据我所知,这里的第二组应该是
cli
,但我得到的结果是空的。您需要转义
。。使用以下命令:
subj = re.match(r"(.*)subj=(.*?)\|(.*)", line).group(2)
^
您需要转义
|
。。使用以下命令:
subj = re.match(r"(.*)subj=(.*?)\|(.*)", line).group(2)
^
|
在regex(创建)中有特殊含义,因此将其转义为
>> re.match(r"(.*)subj=(.*?)\|", line).group(2)
'cli'
另一种解决方案 您可以使用,这样就可以去掉
sub
开头的组和|
后面的组
示例
>>> re.search(r"subj=(.*?)\|", line).group(1)
'cli'
subj = re.match(r"^.*\|subj=([^\|]*)", line).group(1)
这里我们使用group(1)
,因为只有一个组被捕获,而不是像以前的版本那样有三个
复杂版本 如果您正在使用,您甚至可以摆脱所有捕获
>>re.search(r)(?The|
在regex(创建)中有特殊含义,因此将其转义为
>> re.match(r"(.*)subj=(.*?)\|", line).group(2)
'cli'
另一种解决方案
您可以使用,这样就可以去掉sub
开头的组和|
后面的组
示例
>>> re.search(r"subj=(.*?)\|", line).group(1)
'cli'
subj = re.match(r"^.*\|subj=([^\|]*)", line).group(1)
这里我们使用group(1)
,因为只有一个组被捕获,而不是像以前的版本那样有三个
复杂版本
如果您正在使用,您甚至可以摆脱所有捕获
>>re.search(r)(?管道标志|
需要转义,如下所示:
sub=re.match(r“(*)sub=(.*)\ |(.*),s).组(2)
需要转义管道符号|
,如下所示:
subj=re.match(r“(.*)subj=(.*)\ |(.*),s).组(2)
我将使用否定类[^ |]*
和re.search
以获得更好的性能:
import re
p = re.compile(r'^(.*)subj=([^|]*)\|(.*)$')
test_str = "[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"
print re.search(p, test_str).group(2)
看
注意我没有在正则表达式中同时使用懒惰量词和贪婪量词(这通常是不可取的)
管道符号必须转义才能作为文字符号处理
正则表达式解释:
^
-字符串的开头
(.*)
-从开始到结束匹配字符的第一个捕获组
subu=
-一个文本字符串subu=
([^ |]*)
-第二个捕获组匹配除文字管道以外的任何字符(在字符类中,它不需要转义)
\\\124;
-文字管道(必须转义)
(.*)
-第三个捕获组(如果您需要在结束后获取字符串)
$
-字符串结尾
我将使用否定类[^ |]*
和重新搜索
以获得更好的性能:
import re
p = re.compile(r'^(.*)subj=([^|]*)\|(.*)$')
test_str = "[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"
print re.search(p, test_str).group(2)
看
注意我没有在正则表达式中同时使用懒惰量词和贪婪量词(这通常是不可取的)
管道符号必须转义才能作为文字符号处理
正则表达式解释:
^
-字符串的开头
(.*)
-从开始到结束匹配字符的第一个捕获组
subu=
-一个文本字符串subu=
([^ |]*)
-第二个捕获组匹配除文字管道以外的任何字符(在字符类中,它不需要转义)
\\\124;
-文字管道(必须转义)
(.*)
-第三个捕获组(如果您需要在结束后获取字符串)
$
-字符串结尾
我建议使用以下正则表达式,因为它将通过两个添加/替换提供更好的性能:
- 添加行首字符
^
- 添加否定组
[^\|]*
比(.*)快。
代码
>>> re.search(r"subj=(.*?)\|", line).group(1)
'cli'
subj = re.match(r"^.*\|subj=([^\|]*)", line).group(1)
regex:
^.*\|subj=([^\|]*)
我建议使用以下正则表达式,因为它将通过两个添加/替换提供更好的性能:
- 添加行首字符
^
- 添加否定组
[^\|]*
比(.*)快。
代码
>>> re.search(r"subj=(.*?)\|", line).group(1)
'cli'
subj = re.match(r"^.*\|subj=([^\|]*)", line).group(1)
regex:
^.*\|subj=([^\|]*)
作为旁注,您希望使用search()
而不是match()
来摆脱前导的(.*)
。作为旁注,您希望使用search()
而不是match()
来摆脱前导的(.*)
。