Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 非贪婪正则表达式未按预期匹配_Python_Regex - Fatal编程技术网

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()
来摆脱前导的
(.*)