2.1 使用多个界定符分割å—符串¶
问题¶
ä½ éœ€è¦�将一个å—ç¬¦ä¸²åˆ†å‰²ä¸ºå¤šä¸ªå—æ®µï¼Œä½†æ˜¯åˆ†éš”符(è¿˜æœ‰å‘¨å›´çš„ç©ºæ ¼)å¹¶ä¸�是固定的。
解决方案¶
string 对象的 split() 方法å�ªé€‚应于é�žå¸¸ç®€å�•çš„å—符串分割情形,
它并ä¸�å…�许有多个分隔符或者是分隔符周围ä¸�ç¡®å®šçš„ç©ºæ ¼ã€‚
å½“ä½ éœ€è¦�æ›´åŠ ç�µæ´»çš„切割å—符串的时候,最好使用 re.split() 方法:
>>> line = 'asdf fjdk; afed, fjek,asdf, foo'
>>> import re
>>> re.split(r'[;,\s]\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
讨论¶
函数 re.split() 是é�žå¸¸å®žç”¨çš„ï¼Œå› ä¸ºå®ƒå…�è®¸ä½ ä¸ºåˆ†éš”ç¬¦æŒ‡å®šå¤šä¸ªæ£åˆ™æ¨¡å¼�。
比如,在上é�¢çš„例å�ä¸ï¼Œåˆ†éš”符å�¯ä»¥æ˜¯é€—å�·ï¼Œåˆ†å�·æˆ–è€…æ˜¯ç©ºæ ¼ï¼Œå¹¶ä¸”å�Žé�¢ç´§è·Ÿç�€ä»»æ„�ä¸ªçš„ç©ºæ ¼ã€‚
å�ªè¦�这个模å¼�被找到,那么匹é…�的分隔符两边的实体都会被当æˆ�是结果ä¸çš„å…ƒç´ è¿”å›žã€‚
è¿”å›žç»“æžœä¸ºä¸€ä¸ªå—æ®µåˆ—表,这个跟 str.split() è¿”å›žå€¼ç±»åž‹æ˜¯ä¸€æ ·çš„ã€‚
å½“ä½ ä½¿ç”¨ re.split() 函数时候,需è¦�特别注æ„�的是æ£åˆ™è¡¨è¾¾å¼�䏿˜¯å�¦åŒ…å�«ä¸€ä¸ªæ‹¬å�·æ�•获分组。
如果使用了æ�•获分组,那么被匹é…�的文本也将出现在结果列表ä¸ã€‚比如,观察一下这段代ç �è¿�行å�Žçš„结果:
>>> fields = re.split(r'(;|,|\s)\s*', line)
>>> fields
['asdf', ' ', 'fjdk', ';', 'afed', ',', 'fjek', ',', 'asdf', ',', 'foo']
>>>
获å�–分割å—符在æŸ�些情况下也是有用的。 æ¯”å¦‚ï¼Œä½ å�¯èƒ½æƒ³ä¿�留分割å—符串,用æ�¥åœ¨å�Žé�¢é‡�æ–°æž„é€ ä¸€ä¸ªæ–°çš„è¾“å‡ºå—符串:
>>> values = fields[::2]
>>> delimiters = fields[1::2] + ['']
>>> values
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
>>> delimiters
[' ', ';', ',', ',', ',', '']
>>> # Reform the line using the same delimiters
>>> ''.join(v+d for v,d in zip(values, delimiters))
'asdf fjdk;afed,fjek,asdf,foo'
>>>
å¦‚æžœä½ ä¸�想ä¿�留分割å—符串到结果列表ä¸åŽ»ï¼Œä½†ä»�然需è¦�使用到括å�·æ�¥åˆ†ç»„æ£åˆ™è¡¨è¾¾å¼�çš„è¯�,
ç¡®ä¿�ä½ çš„åˆ†ç»„æ˜¯é�žæ�•获分组,形如 (?:...) 。比如:
>>> re.split(r'(?:,|;|\s)\s*', line)
['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
>>>