2016-01-29 92 views
2

我有一個是通過Linux的文件名,作爲一個字符串的函數,這可能看起來像:正則表達式的字符串方含轉義字符

\home\test\2015-11-11\part2\part2a\part2b.png  or 
\test1\test2\test3\test4\test5\2016-01-01\c\test3\test4.bin or 
\opt\logging\bin64\spare\1905-12-12\intereting\file\location\part2.txt 

你可以從我的兩個文件名的例子的位置看日期是可變的。

Python版本是2.7

我只是在日期字段後面的字符串的一部分感興趣。我的想法是使用正則表達式來找到一些位置像

re.search("\d{4}-\d{2}-\d{2}_\d{5}", file_in).end() 

然而\ 2字符串中的存在導致的正則表達式失敗。

在獨立測試,如果我

filename = r'\home\test\2015-11-11\part2\part2a\part2b' 

,因爲它是工作的一個原始字符串,但在我的真正的程序正則表達式將工作,通過文件名不是以原始格式和我找不到一種方式來轉換它,這工作,即對付\2

是否有另一種方法來找到我的約會?

+0

一個Linux的文件名應該是正斜槓分隔。例如。 /home/test/2015-11-11/part2/part2a/part2b.png 你從哪裏得到這些文件名? –

回答

0

當你使用正則表達式時,字符串可能已經被破壞。解決方案可能是在獲取數據之前用雙反斜槓替換反斜槓。

但是,Linux文件名不應該包含反斜槓,並且應該是正斜槓分開的(例如/home/test/2015-11-11/part2/part2a/part2b.png)。如果您可以在收到數據之前將它們轉換爲此格式,那麼您將進行排序。

1

不是100%確定問題是什麼......你的正則表達式不能工作,因爲(1)字符串中沒有_,(2)日期之後的部分不只是數字。

如果您正則表達式的原始字符串,您可以使用\\匹配字符串中的\(或\\\\r),並(.*?)以確保只有在下段被捕獲(非貪婪)。

此正則表達式應該工作:r'\d{4}-\d{2}-\d{2}\\(.*?)\\'

>>> lst 
['\\home\\test\\2015-11-11\\part2\\part2a\\part2b.png', 
'\\test1\\test2\\test3\\test4\\test5\\2016-01-01\\c\\test3\\test4.bin', 
'\\opt\\logging\\bin64\\spare\\1905-12-12\\intereting\\file\\location\\part2.txt'] 
>>> [re.search(r'\d{4}-\d{2}-\d{2}\\(.*?)\\', s).group(1) for s in lst] 
['part2', 'c', 'intereting'] 

注時直接輸入在源代碼中的字符串,一個「原始」的字符串(r'...')纔有意義。如果是這種情況,只需在字符串中添加r前綴。如果字符串來自其他地方,來自文件或UI中的文本字段,則反斜線將自動正確轉義。另外,如前所述,Linux上的路徑分隔符實際上應該是/,而不是\

>>> lst2 = [s.replace('\\', '/') for s in lst] 
>>> [re.search(r'\d{4}-\d{2}-\d{2}/(.*?)/', s).group(1) for s in lst2] 
['part2', 'c', 'intereting'] 
0

那這只是在前面加上r -

import re 


data = [r'\home\test\2015-11-11\part2\part2a\part2b.png', 
r'\test1\test2\test3\test4\test5\2016-01-01\c\test3\test4.bin', 
r'\opt\logging\bin64\spare\1905-12-12\intereting\file\location\part2.txt'] 


def date_finder(s): 
    return re.findall(r'(?<=(?<=\\)(?:\d{4}-\d{2}-\d{2})(?=\\))(.*)',i) 

for i in data: 
    print date_finder(i) 

輸出 -

['\\part2\\part2a\\part2b.png'] 
['\\c\\test3\\test4.bin'] 
['\\intereting\\file\\location\\part2.txt'] 
0

您可以使用raw string,如果你需要在它反斜槓(無論如何,這不能結束一個反斜槓!)。但是在Linux中,路徑的文件夾被向前斜槓分隔

例子:

re.compile(r'\this\is\a\path') 
re.compile(r'\this\doesnt\work\') 

如果您需要的字符串結束與一個反斜槓,你應該使用雙處處反斜槓

re.compile('\\this\\works\\now\\') 

還是有點技巧;)

re.compile(r'\this\also\works'+'\\') 
0

使用/只是我的一部分的拼寫錯誤,使w之後,示例文件名中沒有_xxxxx數據,從而使正則表達式看起來不正確。

我的一位同事看了一眼,似乎認爲這是我閱讀字符串的方式。一旦我將非常類似的代碼應用於我的真實程序,它就能正確地在我的文件名中找到日期字段並且可以工作。

感謝所有爲快速響應

0

當你指定你只想日期後的文件名....

import re 
files=['/home/test/2015-11-11/part2/part2a/part2b.png', 
'/test1/test2/test3/test4/test5/2016-01-01/c/test3/test4.bin', 
'/opt/logging/bin64/spare/1905-12-12/intereting/file/location/part2.txt'] 

for f2 in files: 
    try: 
     last_file=re.split('\d{4}[-]\d{2}[-]\d{2}/',f2)[1].split('/')[-1] 
    except ValueError: 
     last_file="Not Found" 
    print last_file,f2 

將產生的輸出

part2b.png /home/test/2015-11-11/part2/part2a/part2b.png 
test4.bin /test1/test2/test3/test4/test5/2016-01-01/c/test3/test4.bin 
part2.txt /opt/logging/bin64/spare/1905-12-12/intereting/file/location/part2.txt 

步驟是:

  1. 拆分再次使用正則表達式
  2. 分割使用的文件分隔符
  3. 採取最後一個項目從數組

嘗試/除...因爲肯定不是所有的數據將匹配。

問候

相關問題