2015-04-17 145 views
1

我有一個包含unicode字符串Python列表:正則表達式來匹配不同的字符串列表

mylist = [ 
    u'Path:path\\to\\some\\file.html\n user ID: a.b.c\n', 
    u'Path:somewhat\\longer\\path\\to\\some\\file.jpeg\n user ID: a:b_c\n someotherID:x:x:x\n' 
] 

我需要提取唯一路徑的最後一部分:在這種情況下file.html和file.jpeg。是否有任何全面的正則表達式來從我的列表中獲取這些信息?

+0

難道你不是指'file.jpeg'而不是'file.img'嗎? – funkwurm

+0

哦,是的,謝謝指出 – Tania

+0

或'[re.match(r'(?m)Path:。* \\([^ \\\ n] *)$',i).group(1)for i在mylist]' –

回答

2

如果使用ntpath代替os.path你得到正確的行爲,而搖搖欲墜的正則表達式:

>>> import ntpath 
>>> [ntpath.basename(entry.split('\n')[0]) for entry in mylist] 
[u'file.html', u'file.jpeg'] 

與@Kasra所說的相反,你的路徑是有效的,它們只是來自另一個操作系統。

+0

這工作得很好,但有沒有一個正則表達式可以做同樣的事情? – Tania

+1

@Tania是的,沒有。你能寫一個正則表達式來正確地做到這一點嗎?是。這樣做是個好主意嗎?不,我不這麼認爲。如果你寫一個正則表達式,你會專門編寫代碼來處理你現在遇到的這個特殊問題。如果路徑上的某些東西改變了路線,那麼您的正則表達式可能無法處理該問題。通過使用基本名稱,只要您在路徑上運行代碼,您的代碼就會繼續工作。 – kqr

1

你不需要正則表達式,你可以使用os.path,但首先你需要/更換\然後使用path.basename

>>> from os import path 
>>> [path.basename(i.split()[0].replace('\\','/')) for i in mylist if i] 
[u'file.html', u'file.jpeg'] 
+0

我的路徑是有效的@Kasra。他們只是來自不同的操作系統。事實上,他們是unicode字符串,並且像路徑\\分隔\\ \\無論\\ – Tania

+0

@Tania是的,我明白了! ;) – Kasramvd

+0

謝謝。但是當一個額外的空字段出現在列表中時,此解決方案不起作用。拋出索引超出範圍例外 – Tania

1
for path in path_list: 
    # assuming each item in the list actually contains a path 
    print re.search(r'Path:(?:.*?\\)(\w+\.\w+)', path).group(1) 
+0

謝謝Malik這個人也能工作。感謝真棒正則表達式。 – Tania

+0

任何時候,我很高興我能幫上忙。 –