使用捕获组拆分字符串

时间:2017-05-31 04:20:25

标签: python string

我有两个字符串

/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']

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

我用发现者制造了一些东西,但它非常hacky,我正在寻找一种更干净的方式。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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']