不幸的是,拆分需要非零宽度匹配,但尚未解决,因为相当多的错误代码依赖于当前行为,例如使用[something] *作为正则表达式.使用这些模式现在将生成FutureWarning和那些永远不能拆分的模式,从Python 3.5开始抛出ValueError:
>>> re.split(r'(?
Traceback (most recent call last):
File "", line 1, in
File "/usr/lib/python3.6/re.py", line 212, in split
return _compile(pattern, flags).split(string, maxsplit)
ValueError: split() requires a non-empty pattern match.
这个想法是,经过一段时间的警告后,可以改变行为,以便你的正则表达式再次起作用.
如果你不能使用正则表达式模块,你可以使用re.finditer()编写自己的split函数:
def megasplit(pattern, string):
splits = list((m.start(), m.end()) for m in re.finditer(pattern, string))
starts = [0] + [i[1] for i in splits]
ends = [i[0] for i in splits] + [len(string)]
return [string[start:end] for start, end in zip(starts, ends)]
print(megasplit(r'(?
print(megasplit(r'o', 'foobarbarbazbar'))
如果您确定匹配仅为零宽度,则可以使用拆分的开头来获得更简单的代码:
import re
def zerowidthsplit(pattern, string):
splits = list(m.start() for m in re.finditer(pattern, string))
starts = [0] + splits
ends = splits + [ len(string) ]
return [string[start:end] for start, end in zip(starts, ends)]
print(zerowidthsplit(r'(?