2010-03-12 37 views
0

我知道世界上最瘋狂的標題,一個例子應該更好地解釋它。我在下面的格式大的txt文件,但行的具體內容和金額將每次改變:正則表達式找到一個單詞,然後在原始單詞之前提取包含不同單詞的第一次出現的行?

Username: john_joe     Owner: John Joe 
Account: 
CLI:  
Default: 
LGICMD: 
Flags: 
Primary days: 
Secondary days: 
No access restrictions 
Expiration: 
Pwdlifetime: 
Last Login: 
Maxjobs:  
Maxacctjobs: 
Maxdetach: 
Prclm:  
Prio:  
Queprio: 
CPU:  
Authorized Privileges: 
    BYPASS 
Default Privileges: 
    SYSPRV 

此過程重複兩三千次,不同的用戶。我需要找到在「默認權限」下有SYSPRV的每個用戶(理想情況下,上面的第一行)。 我知道我可以寫一個應用程序來做到這一點,我只是希望他們可能是一個很好的正則表達式我可以使用。

乾杯

+0

每個記錄的開頭都標有「用戶名:」行嗎?如果不是有其他方式來區分記錄界限嗎? – msw 2010-03-12 11:59:22

+0

你使用什麼語言或正則表達式?文件有多大,以及你如何閱讀它?你是否一下子把它全部存入內存? – 2010-03-12 13:32:23

回答

3
^Username:\s*(\S+)((?!^Username).)*Default Privileges:\s+SYSPRV 

以使線的^比賽開始,並且使點匹配換行符,將隔離那些記錄和捕捉到的用戶名在反向引用沒有的選項。 1.告訴我你正在使用哪種語言,並提供代碼示例。

說明:

^Username:\s:在該行中,結腸和任何空白的開始匹配「用戶名」。

(\S)+「:匹配任何非空白字符,並將捕捉到的反向引用沒有1.這將是用戶名

((?!Username).)*:只要匹配任何字符,因爲它不是在‘用戶名’的‘U’這確保我們不會意外跨到下一個記錄

Default Privileges:\s+SYSPRV:。符合要求的文本

所以在Python中,例如,你可以使用:

result = re.findall(r"(?sm)^Username:\s*(\S+)((?!^Username).)*Default Privileges:\s+SYSPRV", subject) 
+0

+1很好的答案。對於否定斷言更健壯的是:'(?!^用戶名:)'。 – FMc 2010-03-12 13:48:27

+0

感謝您的快速回復添。我希望能用grep來做到這一點,這可能嗎?謝謝。 – Hinchy 2010-03-12 14:05:16

+0

我不確定 - 不太瞭解Unix工具集。我認爲原始的grep不支持lookahead(這個正則表達式使用),並且是基於行的,所以你不能在幾行內匹配。但我可能完全錯了。 – 2010-03-12 16:02:44

相關問題