正则表达式来匹配不同的字符串列表

问题描述:

我有一个包含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]' –

如果使用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

你不需要正则表达式,你可以使用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

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

任何时候,我很高兴我能帮上忙。 –