使用re
模块,我似乎无法拆分空字符串的模式匹配:
>>> re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')
['foobarbarbazbar']
换句话说,即使找到了匹配项,如果是空字符串,即使re.split
也无法拆分该字符串。在
docs for ^{
对于这种特殊情况,很容易找到一个“变通办法”:
^{pr2}$但这是一种容易出错的方法,因为这样我就必须小心那些已经包含我要拆分的子字符串的字符串:
>>> re.sub(r'(?<!foo)(?=bar)', 'qux', 'foobarbarquxbar').split('qux')
['foobar', 'bar', '', 'bar']
有没有更好的方法来分割与re
模块匹配的空模式?另外,为什么re.split
不允许我这样做呢?我知道其他使用regex的分割算法也是可能的;例如,我可以用JavaScript的内置^{
您可以在这里使用^{} 模块。在
或者
^{pr2}$使用
re.findall
。在See demo
不幸的是,
split
需要一个非零宽度匹配,但是它还没有被修复,因为很多不正确的代码依赖于当前的行为,例如使用[something]*
作为regex。使用这样的模式现在将生成一个FutureWarning
,而那些从不可以拆分任何内容的模式,从python3.5以后的版本中抛出一个ValueError
:其思想是,在警告一段时间后,可以更改行为,以便正则表达式可以再次工作。在
如果不能使用
^{pr2}$regex
模块,可以使用re.finditer()
编写自己的拆分函数:如果确定匹配项仅为零宽度,则可以使用拆分的开头以简化代码:
相关问题 更多 >
编程相关推荐