栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python正则表达式:拆分为空字符串的模式匹配

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python正则表达式:拆分为空字符串的模式匹配

不幸的是,

split
要求非零宽度匹配,但尚未解决,因为很多不正确的代码都依赖于当前行为,例如使用
[something]*
正则表达式。现在,使用此类模式会生成,
FutureWarning
而那些
永远 无法拆分的模式会
ValueError
从Python 3.5开始抛出:

>>> re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')Traceback (most recent call last):  File "<stdin>", line 1, in <module>  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.

这个想法是,在一定时间的警告后,可以更改行为,以便您的正则表达式将再次起作用。


如果您不能使用该

regex
模块,则可以使用以下代码编写自己的split函数
re.finditer()

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'(?<!foo)(?=bar)', 'foobarbarbazbar'))print(megasplit(r'o', 'foobarbarbazbar'))

如果您确定匹配项仅是零宽度,则可以使用分割的开头来获得更简单的代码:

import redef 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'(?<!foo)(?=bar)', 'foobarbarbazbar'))


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/640888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号