Python正则表达式拆分保持拆分模式字符

use*_*774 7 python regex

最简单的解释方法就是一个例子:我有这个字符串:'Docs/src/Scripts/temp'我知道如何分割两种不同的方式:

re.split('/', 'Docs/src/Scripts/temp') -> ['Docs', 'src', 'Scripts', 'temp']

re.split('(/)', 'Docs/src/Scripts/temp') -> ['Docs', '/', 'src', '/', 'Scripts', '/', 'temp']
Run Code Online (Sandbox Code Playgroud)

是否有一种方法可以通过正斜杠划分,但保留斜杠的一部分?例如,我希望上面的字符串看起来像这样:

['Docs/', '/src/', '/Scripts/', '/temp']
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激!

And*_*ark 8

有趣的问题,我建议做这样的事情:

>>> 'Docs/src/Scripts/temp'.replace('/', '/\x00/').split('\x00')
['Docs/', '/src/', '/Scripts/', '/temp']
Run Code Online (Sandbox Code Playgroud)

这里的想法是首先将所有/字符替换/为由特殊字符分隔的两个字符,这些字符不是原始字符串的一部分.我使用了一个空字节('\x00'),但您可以将其更改为其他内容,然后最终拆分该特殊字符.

正则表达式在这里实际上并不是很好,因为你不能分割零长度匹配,并且re.findall()找不到重叠匹配,所以你可能需要对字符串进行多次传递.

此外,re.split('/', s)将做同样的事情s.split('/'),但第二个更有效.


Tim*_*ker 5

一个没有split()但前瞻性的解决方案:

>>> s = 'Docs/src/Scripts/temp'
>>> r = re.compile(r"(?=((?:^|/)[^/]*/?))")
>>> r.findall(s)
['Docs/', '/src/', '/Scripts/', '/temp']
Run Code Online (Sandbox Code Playgroud)

说明:

(?=        # Assert that it's possible to match...
 (         # and capture...
  (?:^|/)  #  the start of the string or a slash
  [^/]*    #  any number of non-slash characters
  /?       #  and (optionally) an ending slash.
 )         # End of capturing group
)          # End of lookahead
Run Code Online (Sandbox Code Playgroud)

由于在字符串中的每个位置都尝试了先行断言,并且不使用任何字符,因此重叠匹配没有问题.