2015-11-03 92 views
0

嗨即时通讯使用这个正则表达式:正则表达式只捕获第二occurence

.*@.*\:.*#\s(.*) 

在这样的文字:

[email protected]:/opt/test# cd /opt/blabla/¢ ־.P־.®Z[P§..P.#ְ״[email protected]:/opt/testo# nano /etc/d× ־.P־.®Z[_§.. 

和正则表达式只捕获

nano /etc/d× ־.P־.®Z[_§.. 

我想只捕捉命令cd /opt/blablanano /etc/d 为什么正则表达式不捕捉cd /opt/blabla

编辑: 我想首先把所有非ASCII字符空格现在的文字是这样的:

'[email protected]:/opt/volatility# cd /opt/Kazaar/  .P .  Z[P ..P.# [email protected]:/opt/Kazaar# nano /etc/d  .P .  Z[_ ..' 

每条命令空间结束,所以我改变了正则表达式:

""".*@.*\:.*#\s(.*)\s""" 

但是它仍然只捕获没有cd的nano命令。

+0

访问比赛UNIX命令工作,我建议你有一个玩例如https://regex101.com/r/nP0mW2/1 – jonrsharpe

+1

因为它与正则表达式不匹配,所以在预期的匹配中你会在哪里看到'@'?你的问题不清楚。 – Maroun

+0

看看[这个演示](https://ideone.com/PMlGIe),你在找什么? –

回答

0

对于这个特定使用情况下,具有非ASCII字符,以下正则表达式将捕获完整的命令:

[^#]*#\s([\x00-\x7F]*) 

Ubuntu的命令提示从命令由#符号分离。 我们以[^#]而不是.*开头的原因是因为.*太贪婪:它会消耗#的所有实例,除了最后一个。所以我们必须明确告诉正则表达式首先不要匹配任何#字符。

上面的正则表达式会捕获命令名和任意数量的ASCII参数,因此您应该将它用于原始版本的代码(不要用空格替换所有非ASCII字符)。下面是输出:

cd /opt/blabla/ 
nano /etc/d 

也有可能,有一个稍微复杂的正则表达式,解析UNIX命令和命令提示,当他们只用空格隔开。你会删除非ASCII字符和修剪过度的空白之后,您就会有一个看起来像这样的一行:

[email protected]:/opt/test# cd /opt/blabla/ [email protected]:/opt/testo# nano /etc/d 

然后你可以使用向前断言只匹配命令及其参数:

[^\x64 ][email protected][^#]+#\s*(.+?(?=\s+[^\x64 ][email protected]|\s*$)) 

最后,所有的最复杂的,如果你有不一致的行,其中一些命令是由空格隔开,并通过非ASCII字符别人,你可以这样做:

[^\x64 ][email protected][^#]+#\s*([\x00-\x7F]+(?=[^\x00-\x7F]+|\s+[^\x64 ][email protected]|\s*$)) 

第一部分[^\x64 ][email protected][^#]+#涵盖了Ubuntu提示符。然后有任意的空格\s*,那么该组匹配尽可能多的ASCII字符,而不会遇到任何非ASCII字符,行尾或另一个UNIX提示符。这意味着它也将针对多个参数,如mvcp

0

你的比赛是过于贪婪尝试this

/.*[email protected]*?\:.*?#\s(.*? .*?)/

为什么试图在比赛前得到字符的最小量。这假设在#之后有两个“单词”被一个空格分开,以空格结束。

如果您的文本包含CR字符以分离出命令,因为无法确定您正在查找的命令和参数的准确率达到100%,而无需清理数据,因为无法确定“队伍的尽头”。

+0

我试过这个它只捕捉“cd”和“nano”我想捕捉到完整的命令 – krukita

+0

您是否尝试过链接? – ergonaut

0

在蟒蛇3.5

In [1]: import re 

In [2]: string = '[email protected]:/opt/test# cd /opt/blabla/¢ ־.P־.®Z[P§..P.#ְ״[email protected]:/opt/testo# nano /etc/d× ־.P־.®Z[_§..' 

In [3]: pattern = '\w+\ (\/\w+)+' 

In [4]: list(re.finditer(pattern,string)) 
Out[4]: 
[<_sre.SRE_Match object; span=(20, 34), match='cd /opt/blabla'>, 
<_sre.SRE_Match object; span=(80, 91), match='nano /etc/d'>] 

您可以通过.group(0)

In [5]: list(re.finditer(pattern,string))[0].group(0) 
Out[5]: 'cd /opt/blabla' 

In [6]: list(re.finditer(pattern,string))[1].group(0) 
Out[6]: 'nano /etc/d'