2012-06-06 64 views
0

我想寫一個正則表達式來匹配文件中的庫和包含該文件的路徑。文件中的所有庫都將採用該格式。Python的正則表達式匹配路徑

text = "mylib|C://desktop//baseicmylib.lib 
     randlib|C://desktop//randlib.lib" 

,所以如果我想找到MYLIB

我寫

str = "mylib" 
pattern = r'%s\\|.*lib'%str 
mypath = re.findall(pattern,text) 

有人可以幫助我在哪裏,我犯了一個錯誤。

回答

3

它也許沒有正則表達式的需要?

text = '''mylib|C://desktop//baseicmylib.lib 
    randlib|C://desktop//randlib.lib''' 

libs = dict(line.split('|', 1) for line in 
    (s.strip() for s in text.split('\n'))) 

結果:

{'randlib': 'C://desktop//randlib.lib', 
    'mylib': 'C://desktop//baseicmylib.lib'} 
1

//之前導致管道問題。 我下面的作品就好了:

text = "argh|foo.lib" 
str = "argh" 
pattern = r"%s\|.*lib" %str 
print re.findall(pattern,text) 

['argh', '|hehe.lib'] 

用於轉義,如果你本來想一個原始字符串內逃脫一個\就足夠了(和雙\對非原始字符串)//心不是

+0

'|'需要逃脫。在你的情況下,它給出了錯誤的輸出。它匹配的lib和其匹配的路徑,因爲或運算符 – mousey

+0

然後反斜槓是轉義字符,而不是正斜槓。 – cjh

+0

謝謝,我明白了。這是一個愚蠢的錯誤 – mousey

1

需要調整你的模式一點點:

text = '''mylib|C://desktop//baseicmylib.lib 
randlib|C://desktop//randlib.lib''' 
str = 'mylib' 
pattern = "%s\|(.+?\.lib)" %str 
print re.findall(pattern,text) 
0
>>>pattern = r'%s.*?lib'%str 
>>>re.findall(pattern, text) 
['mylib|C://desktop//baseicmylib'] 

它是一個no-greedy匹配正則表達式中

* ?, + ?, ??

'*','+''?'限定符都是貪婪的,它們匹配儘可能多的文本。有時候這種行爲是不希望的;如果RE <.*>與「標題」匹配,它將匹配整個字符串,而不僅僅是「'。添加'?'在限定符之後以非貪婪或最小方式進行匹配;儘可能少的字符將被匹配。使用。*?在前面的表達式中只會匹配''。