Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式拆分保留拆分模式字符_Python_Regex - Fatal编程技术网

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

Python正则表达式拆分保留拆分模式字符,python,regex,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'] 有没有

解释这一点的最简单方法是一个示例: 我有一个字符串:“Docs/src/Scripts/temp” 我知道如何将其分为两种不同的方式:

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

re.split('(/)', 'Docs/src/Scripts/temp') -> ['Docs', '/', 'src', '/', 'Scripts', '/', 'temp']
有没有办法用正斜杠分开,但保留单词的斜杠部分? 例如,我希望上面的字符串如下所示:

['Docs/', '/src/', '/Scripts/', '/temp']
>>> 'Docs/src/Scripts/temp'.replace('/', '/\x00/').split('\x00')
['Docs/', '/src/', '/Scripts/', '/temp']

任何帮助都将不胜感激

有意思的问题,我建议你这样做:

['Docs/', '/src/', '/Scripts/', '/temp']
>>> 'Docs/src/Scripts/temp'.replace('/', '/\x00/').split('\x00')
['Docs/', '/src/', '/Scripts/', '/temp']
这里的想法是首先将所有
/
字符替换为两个
/
字符,两个字符之间由一个特殊字符分隔,该字符不是原始字符串的一部分。我使用了一个空字节(
'\x00'
),但您可以将其更改为其他内容,然后最终在该特殊字符上拆分

这里的正则表达式实际上并不好,因为您无法对零长度匹配进行拆分,并且
re.findall()
没有找到重叠的匹配,因此您可能需要对字符串进行多次传递


另外,
re.split('/',s)
将执行与
s.split('/')
相同的操作,但第二种方法更有效。

我不确定是否有一种简单的方法可以做到这一点。这是我能想到的最好的

import re

lSplit = re.split('/', 'Docs/src/Scripts/temp')
print [lSplit[0]+'/'] + ['/'+x+'/' for x in lSplit][1:-1] + ['/'+lSplit[len(lSplit)-1]]
有点乱,但它确实可以满足您的需要。

1)您不需要正则表达式在单个固定字符上拆分:

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

< P > 2)考虑使用该方法:

import os.path

def components(path):
    start = 0
    for end, c in enumerate(path):
        if c == os.path.sep:
            yield path[start:end+1]
            start = end
    yield path[start:]

它不依赖于像拆分-连接-拆分这样的聪明技巧,在我看来,这使它更具可读性。

如果你不坚持两边都有斜线,它实际上非常简单:

>>> re.findall(r"([^/]*/)", 'Docs/src/Scripts/temp')
['Docs/', 'src/', 'Scripts/']

对于重叠的字符串,
re
和split都不是真正需要的,所以如果这是您真正想要的,我只需要在每个结果的开头添加一个斜杠,第一个除外

没有
split()
但有lookaheads的解决方案:

>>> s = 'Docs/src/Scripts/temp'
>>> r = re.compile(r"(?=((?:^|/)[^/]*/?))")
>>> r.findall(s)
['Docs/', '/src/', '/Scripts/', '/temp']
说明:

(?=        # 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
由于在字符串中的每个位置都尝试了前瞻性断言,并且不使用任何字符,因此它不存在重叠匹配的问题。

尝试以下方法:

re.split(r'(/)', 'Docs/src/Scripts/temp')
来自python文档

重新拆分(模式、字符串、maxsplit=0、标志=0)

将字符串按 图案的出现如果在模式中使用捕获括号, 然后,模式中所有组的文本也作为一部分返回 如果maxsplit为非零,则最多maxsplit拆分 发生,字符串的其余部分作为最终值返回 列表的元素。(不兼容说明:在原始Python 1.5中) 已忽略版本,maxsplit。这已在以后的版本中修复。)


执行拆分和连接就像是
'Docs/src/Scripts/temp'.replace('/','/\x00/')
@gnibbler-愚蠢的我,谢谢你,这样更干净了!编辑了我的答案,改用它。哇!非常好,比我的好得多。
re.findall()没有找到重叠的匹配项
,但它可以在查找中找到。我想出了这个findall:
(?=((?:^ |/)[^/]+/?)
,将字符串捕获到组1。然后看到Tim发布了相同的内容,除了右侧窗格中的捕获内容之外。很抱歉今天跟踪你,安德鲁,从你开始,一直在阅读regex用户的答案。再见@zx81绝对不介意跟踪,谢谢你的深思熟虑的评论和投票:)为什么你只需要一个字符就需要正则表达式呢?你不需要。如果需要,可以使用str.split()。不管怎么说,F.J的答案比我的好。它是
re.split(“(/)”,…)
,而不是
re.split(“/”),…)
。哈,我问这个问题只是为了好玩,结果和你一样,一个字符一个字符!(除了我有一个
+
,你有一个
*
):+1