2015-11-03 51 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'