pythonregex:在模式匹配时拆分,这是一个空字符串

2024-10-02 04:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

使用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的内置^{}来实现这一点。在


Tags: 模块方法字符串redocsforfoobar
2条回答
import regex
x="bazbarbarfoobar"
print regex.split(r"(?<!baz)(?=bar)",x,flags=regex.VERSION1)

您可以在这里使用^{}模块。在

或者

^{pr2}$

使用re.findall。在

See demo

不幸的是,split需要一个非零宽度匹配,但是它还没有被修复,因为很多不正确的代码依赖于当前的行为,例如使用[something]*作为regex。使用这样的模式现在将生成一个FutureWarning,而那些从不可以拆分任何内容的模式,从python3.5以后的版本中抛出一个ValueError

>>> 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模块,可以使用re.finditer()编写自己的拆分函数:

^{pr2}$

如果确定匹配项仅为零宽度,则可以使用拆分的开头以简化代码:

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

相关问题 更多 >

    热门问题