Python re.split()在处理带引号的字符串时使用空格

Python re.split()在处理带引号的字符串时使用空格,python,regex,Python,Regex,所以我以前见过讨论这个主题,但是需求总是比我需要的要宽松一些。我要寻找的是一个regexp模式,它将在原子化处理引用子字符串的同时在空间上拆分。然而,我正在寻找一种解决方案,该解决方案: 是单个正则表达式模式和对re.split()的单个调用,因为 我需要它来处理maxsplit参数 例如: s = 'chat "john doe" Use "foo or bar", not "baz and gruz" .' results = re.split(PATTERN, s, maxplit

所以我以前见过讨论这个主题,但是需求总是比我需要的要宽松一些。我要寻找的是一个regexp模式,它将在原子化处理引用子字符串的同时在空间上拆分。然而,我正在寻找一种解决方案,该解决方案:

  • 是单个正则表达式模式和对re.split()的单个调用,因为
  • 我需要它来处理maxsplit参数
  • 例如:

    s = 'chat "john doe" Use "foo or bar",   not  "baz and gruz" .'
    
    results = re.split(PATTERN, s, maxplit=2)
    
    结果应该是:

    ['chat', '"joe doe"', 'Use "foo or bar",   not  "baz and gruz" .']
    
    到目前为止,我看到的所有此类问题的解决方案都涉及到re.findall()或列表理解,以从re.split()的结果中提取空字符串,这两种方法都消除了使用maxsplit功能的能力。我不想编写一个自己的函数来完成maxsplit已经对re.split()所做的工作——在本用例中,重要的一点是,当多个空格超过maxsplit边界时,会保留多个空格,如我的示例所示

    编辑: 因此,我找到了一种方法来适应以前的解决方案:

    def mysplit(s, maxsplit=0):
        PATTERN = r"(\s|\".*?\"|'.*?')"
        return [p for p in re.split(PATTERN, s, maxsplit=maxsplit) if p.strip()]
    
    我要寻找的是一个regexp模式,它将在原子化处理引用子字符串的同时在空间上拆分

    这应该行得通。按匹配的空格将其拆分

    (?<=\S)\s(?=\")|(?<=\")(?!\S+)\s
    

    (?您可以通过检查前面是否有偶数个引号来检查所匹配的空格是否在引号之外。因此,以下正则表达式将只匹配引号之外的空格:

    PATTERN = r'(?<=(.*?".*?".*?)*)\s'
    

    PATTERN=r'(?您可以在此处使用负前瞻

    >>> import re
    >>> s = 'chat "john doe" Use "foo or bar",   not  "baz and gruz" .'
    >>> results = re.split(r' +(?![^"]*"(?:(?:[^"]*"){2})*[^"]*$)', s, 2)
    >>> results
    
    ['chat', '"john doe"', 'Use "foo or bar",   not  "baz and gruz" .']
    

    为什么
    “foo或bar”
    不匹配?输出字符串与输入不匹配string@famousgarkin关于你的最后一点,我想他指的是
    maxslit
    参数。只处理前两个拆分,其余的在最后一个字符串中。为什么最后一个点不是单独的匹配项?因为maxslit参数是re.split()在第二个空格后停止拆分。我在Python 3.4中尝试编译时遇到语法错误。如果用双引号括住字符串,是否要转义引号?我做了
    pat=re.compile(r“”)(?“look behind requires fixed width pattern”我总是忘了这一点。如果格式不正确,这不会失败吗(但可能是正确的)字符串,如
    此引用文本包含“前导空格”