在任意多个分隔符上拆分字符串

有时我们需要将字符串拆分为字段,但分隔符(及其周围的间距)在整个字符串中不一致。即需要同时使用 多个分隔符以进行匹配。

str对象的split方法只能进行简单的字符串拆分,它的sep参数无法使用正则表达式进行模糊匹配。但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()时,如果正则表达式模式涉及在括号中的捕获分组,则需要小心。 如果使用捕获组(capture group),则匹配的文本也包含在结果中。 例如:

>>> 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'] 
>>>
posted @ 2019-08-08 14:33  Jeffrey_Yang  阅读(198)  评论(0编辑  收藏  举报