2017-01-19 132 views
0

我想用下面的模式提取字符串。Python正則表達式匹配

MsgTrace(65/26)noop:user=xxx=INBOX:cmd=534 

正則表達式應該提取空操作

但是當我嘗試follwong模式,它提取字符串「用戶」爲好。

ImapFetchComplete(56/39)user=xxxxxxxxxx 

需要輸出的字只包含以下模式。

)somestring: (it should extract the word somestring) 

)somestring=xxxx (this shouldn't be extracted) 
#!/usr/bin/python 
import os 
from subprocess import * 
import os 
import re 

dir="/tmp/logs/" 
os.chdir(dir) 
for filename in os.listdir(dir): 
    with open(filename) as fp: 
     for line in fp: 
      try: 
       print(re.search(r'\)([a-z]*?):',line).group(1)) 
      except: 
       pass 
+0

它看起來不像正則表達式有問題,請參閱https://regex101.com/r/ImzAyW/1。它不能匹配')somestring = xxxx'中的'somestring',因爲沒有':'。 –

+0

它出了既somestring和somestring =,在這個例子中它輸出noop和用戶= xxxxxxxxxx –

+0

我認爲你的例子是不完整的(因爲它的行爲如預期,但只是偶然)。我認爲你希望你的匹配模式是'r'\)([^:] *?):user =''這樣你就不會撿起其餘的線。我想你可能想要使用're.match()'而不是're.search()',如果你希望匹配在字符串的開始處開始。不過,如果您使用're.match()',則需要再調整一次正則表達式。 – jszakmeister

回答

1

這是否你想要做什麼?

import re 


def extract_from_string(s): 
    match = re.search('(?<=\))\w*?(?=:)', s) 
    return match.group(0) if match else None 


if __name__ == '__main__': 
    s1 = 'MsgTrace(65/26)noop:user=xxx=INBOX:cmd=534' 
    s2 = 'ImapFetchComplete(56/39)user=xxxxxxxxxx' 
    s3 = 'foo' 
    print(extract_from_string(s1)) # 'noop' 
    print(extract_from_string(s2)) # None 
    print(extract_from_string(s3)) # None 
+0

如果你在日誌中同時存在s1,s2,我只需要提取noop而不是user = xxxxx –

+1

@TharangaAbeyseela難題,簡單修復。現在好嗎? – Tagc

+0

一切都很好,謝謝:) –