從這個例子的右邊或左邊:的Python re.split和附加匹配組到分離
>>> re.split('(\W)', 'foo/bar spam\neggs')
['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
是存在於捕獲組與右側或左側部分聯繫起來的簡單方法分裂?例如。使用相同的正則表達式/捕獲組,但產生:
['foo', '/bar', ' spam', '\neggs']
或可選
['foo/', 'bar ', 'spam\n', 'eggs']
我敢肯定,你可以通過改變實際的正則表達式實現它,但是這不是重點(和我們可以修改該示例以使匹配更加複雜,因此無法僅僅重新使用它們並將它們推向右側或左側是一種真正的痛苦)。
不幸的是,它看起來像使它成爲一個非捕獲組只下降從匹配相應的字符:
>>> re.split('(?:\W)', 'foo/bar spam\neggs')
['foo', 'bar', 'spam', 'eggs']
舉另一個例子,考慮如果你有從行爲不端的CSV文件中的一些文本。每行只有一個實際的逗號分開,但不小心某些行在其中一個字段中也有逗號。幸運的是,不分裂的逗號總是跟着一個空格。
csv_data = [
'Some good data,Id 5',
'Some bad data, like, really bad, dude,Id 6'
]
在這種情況下,我們的目標是處理這個:通過使用簡單的re.split
[['Some good data', 'Id 5'],
['Some bad data, like, really bad, dude', 'Id 6']]
。
使用map(lambda x: re.split(",(?:\S)", x), csv_data)
產生
[['Some good data', 'd 5'],
['Some bad data, like, really bad, dude', 'd 6']]
,並使用map(lambda x: re.split(",(\S)", x), csv_data)
產生
[['Some good data', 'I', 'd 5'],
['Some bad data, like, really bad, dude', 'I', 'd 6']]
那麼,什麼是一個通用的方法來re.split
,將工作同樣爲這兩種情況?基本上這是我可以在一個功能包,像
def my_split(regex_chars, my_strs):
return map(lambda x: re.split(...regex_chars..., x), my_strs)
使得兩個
my_split(r'(\W)', ['foo/bar spam\neggs'])
和
my_split(r',(\S)', csv_data)
每個返回預期輸出從上方。
注:看來這是不可能在短短re
,但也有可能與基礎上,拆分是否是零寬度與否regex
和re
一些混合物。
如果你堅持使用're.split()' – hwnd 2015-02-09 02:43:00
,你將需要修改正則表達式,它不會直接通過re.split在分割不能在邊界上工作。 – 2015-02-09 02:43:13
@hwnd那麼上面的評論就是答案。 – 2015-02-09 02:47:40