2017-05-31 62 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'。雖然這不需要捕捉每一塊,但這似乎並不是你所要求的「更清潔的方式」。 –