正则表达式仅捕获第二次出现

时间:2015-11-03 14:51:00

标签: python regex

我正在使用这个正则表达式模式:

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

在这篇文章中:

t@ubuntu:/opt/test# cd /opt/blabla/¢ ־.P־.®Z[P§..P.#ְ״toot@bubuntu:/opt/testo# nano /etc/d× ־.P־.®Z[_§..

只有正则表达式才能抓住

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

我试图只抓住命令cd /opt/blablanano /etc/d 为什么正则表达式没有抓住cd /opt/blabla

编辑: 我试图首先将所有非ascii字符转换为空格,现在文本看起来像:

't@ubuntu:/opt/volatility# cd /opt/Kazaar/     .P  .     Z[P  ..P.#    root@ubuntu:/opt/Kazaar# nano /etc/d     .P  .     Z[_  ..'

每个以空格结尾的命令,所以我将正则表达式更改为:

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

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

3 个答案:

答案 0 :(得分:0)

你的比赛太贪心了this

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

为什么尝试在匹配前获得最少量的字符。这假设#之后有两个“单词”用空格分隔,以空格结尾。

如果您的文本包含一个CR字符来分离命令会更好,因为无法确定所需的命令和参数,而无需清理数据,因为无法确定“行的结尾“。

答案 1 :(得分:0)

对于这个特殊用例,对于非ASCII字符,以下正则表达式将捕获完整命令:

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

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

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

cd /opt/blabla/
nano /etc/d

使用稍微复杂的正则表达式来解析UNIX命令和命令提示也是可能的,当它们仅由空格分隔时。因此,在您删除非ASCII字符并修剪任何过多的空格后,您就会看到如下所示的行:

t@ubuntu:/opt/test# cd /opt/blabla/ toot@bubuntu:/opt/testo# nano /etc/d

然后你可以使用lookahead断言来匹配命令及其参数:

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

最后,也是最复杂的,如果你有一个不一致的行,其中一些命令被空格分隔,而其他命令被非ASCII字符分隔,你可以使用它:

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

第一部分[^\x64 ]+@[^#]+#涵盖了Ubuntu提示。然后是任意空格\s*,然后该组匹配尽可能多的ASCII字符,而不会遇到任何非ASCII字符,行尾或其他UNIX提示符。这意味着它也适用于带有多个参数的UNIX命令,例如mvcp

答案 2 :(得分:0)

在python 3.5中

In [1]: import re

In [2]: string = 't@ubuntu:/opt/test# cd /opt/blabla/¢ ־.P־.®Z[P§..P.#ְ״toot@bubuntu:/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'