2017-05-31 28 views
0

我有两个字符串分割使用字符串捕捉组

/some/path/to/sequence2.1001.tif 

/some/path/to/sequence_another_u1_v2.tif 

我想编写一个函数,这样两个字符串可以通过一些正则表达式来分割成一个列表,并加入回到一起,而不会丢失任何字符。

所以

def split_by_group(path, re_compile): 
    # ... 
    return ['the', 'parts', 'here'] 

split_by_group('/some/path/to/sequence2.1001.tif', re.compile(r'(\.(\d+)\.') 
# Result: ['/some/path/to/sequence2.', '1001', '.tif'] 

split_by_group('/some/path/to/sequence_another_u1_v2.tif', re.compile(r'_[uv](\d+)') 
# Result: ['/some/path/to/sequence_another_u', '1', '_v', '2', '.tif'] 

这是不那么重要的是,正则表达式是什么我上面写的(但理想情况下,我想接受的答案同时使用)。我唯一的标准是,拆分字符串必须是可组合的,不会丢失任何数字,并且每个组按照我上面显示的方式拆分(拆分发生在捕获组的开始/结束处,而不是完整字符串。

我与finditer的东西,但它是可怕的哈克和我在寻找一个更清洁的方式。任何人都可以帮我吗?

+1

可能重复[在Python中,我如何拆分字符串并保留分隔符?](https://stackoverflow.com/questions-2136556/in-python-how-do-i-split-a-string-and-keep-the-separators) – szabadkai

+0

如果这些是路径,你可以考虑'os.path' – pylang

回答

1

改变了你的正则表达式一点点,如果你不介意的话。不知道这与您的其他情况下工作。

def split_by_group(path, re_compile): 
    l = [s for s in re_compile.split(path) if s] 
    l[0:2] = [''.join(l[0:2])] 
    return l 

split_by_group('/some/path/to/sequence2.1001.tif', re.compile('(\.)(\d+)')) 
# Result: ['/some/path/to/sequence2.', '1001', '.tif'] 

split_by_group('/some/path/to/sequence_another_u1_v2.tif', re.compile('(_[uv])(\d+)')) 
# Result: ['/some/path/to/sequence_another_u', '1', '_v', '2', '.tif'] 
+0

完美工作。接受你的答案。问题虽然 - 有没有什么办法可以在不将每个组件分成单独的组的情况下获得相同的效果?在我的情况下,我的正则表达式是灵活的,但我想知道在其他情况下 – ColinKennedy

+0

我不能确定,但​​我不认为有一个简单的方法来做到这一点。它记录为're.split':“如果在模式中使用捕获括号,那么模式中所有组的文本也会作为结果列表的一部分返回。”换句话说,如果你不捕捉每一个片断,它将被丢弃。那么你不能使用're.split',但必须在循环中使用're.search'或're.match'。虽然这不需要捕捉每一块,但这似乎并不是你所要求的“更清洁的方式”。 –