2015-07-21 97 views
1

有人可以請回答嗎? 我正在嘗試學習reg表達式(重新)模塊,並且我無法在這個模塊中找到我的頭。我試圖想出正則表達式來捕獲所有3文件名格式正則表達式python 3.4

的Python 3.4.3

>>> re.findall("file[\_-]1","file-1 file_1, file\1") 
['file-1', 'file_1'] 
>>> 

爲什麼沒有趕上文件\ 1 ?? 我也嘗試其他兩種模式,沒有一個工作:(

1. re.findall("file[\\_-]1","file-1 file_1, file\1") 
2. re.findall(r"file[\_-]1","file-1 file_1, file\1") 

感謝, 薩加爾

+1

反斜槓在Python字符串和正則表達式特殊的含義......看到例如https://docs.python.org/3/howto/regex.html#the-backslash-plague – jonrsharpe

+0

「file \ 1」中的'\ 1'是一個控制字符'\ u0001;'。如果你真的打算捕獲它,使用'print(re.findall(「file [\ u0001 _-] 1?」,「file-1 file_1,file \ 1」))',但我懷疑你需要它。 –

回答

1

反斜線在正則表達式有意義,太; \_只是意味着一個文字下劃線,或者下劃線或反斜槓,而是需要r'...'(原始Python字符串)\\(正則表達式中的文字反斜槓)請注意,您嘗試搜索的字符串也應該是原始文字都有了成倍的反斜槓:

>>> "file-1 file_1, file\1" 
'file-1 file_1, file\x01' # probably not what you expected... 
>>> r"file-1 file_1, file\1" 
'file-1 file_1, file\\1' 

因此,您可以:

>>> re.findall(r"file[\\_-]1", r"file-1 file_1, file\1") 
     # note^ ^ ^
['file-1', 'file_1', 'file\\1'] 
+0

我正在閱讀你提到的python文檔。直到這一行都是很好的......「但是,要將它表示爲Python字符串文字,則必須再次轉義兩個反斜槓。」 此外,當您使用反斜槓內部字符集[]其特殊的含義應該走正確的..所以我的正則表達式可以安全地是: re.findall(「文件[\] 1」,「文件1 file_1,文件\ 1 「)....當然這不起作用。 其次,如果我使用正則表達式的原始字符串,那麼特殊字符會自動被省略。因此,這將是: re.findall(R 「文件[\] 1」, 「文件1 file_1,文件\ 1」) 爲什麼原始字符串+額外\ –

+0

@SagarKarale方括號中*只有正則表達式的特殊含義* 已移除。您仍然需要將反斜槓加倍或使其成爲原始字符串以除去*字符串字面特殊含義*。 – jonrsharpe

+0

謝謝喬恩..更多的例子清楚地表明......我不得不比以前更多地考慮「字符串文字」和「正則表達式」...... –