我正在使用这个正则表达式模式:
.*@.*\:.*#\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/blabla
和nano /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命令。
答案 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命令,例如mv
或cp
答案 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'