Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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

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,我需要一种从字符串中删除所有空格的方法,除非空格在引号之间 result = re.sub('".*?"', "", content) 这将匹配引号之间的任何内容,但现在它需要忽略该匹配并添加空白的匹配项。您可以使用shlex.split进行引号感知拆分,并使用“.join”连接结果。例如 print " ".join(shlex.split('Hello "world this is" a test')) 我不认为你能用一个正则表达式做到这一点。一种方法是拆分引号上的字

我需要一种从字符串中删除所有空格的方法,除非空格在引号之间

result = re.sub('".*?"', "", content)

这将匹配引号之间的任何内容,但现在它需要忽略该匹配并添加空白的匹配项。

您可以使用shlex.split进行引号感知拆分,并使用“.join”连接结果。例如

print " ".join(shlex.split('Hello "world     this    is" a    test'))

我不认为你能用一个正则表达式做到这一点。一种方法是拆分引号上的字符串,将空格剥离正则表达式应用于结果列表的其他每一项,然后重新加入列表

import re

def stripwhite(text):
    lst = text.split('"')
    for i, item in enumerate(lst):
        if not i % 2:
            lst[i] = re.sub("\s+", "", item)
    return '"'.join(lst)

print stripwhite('This is a string with some "text in quotes."')

这里有一个很长的小版本,没有双引号。仅处理一种样式的开始和结束字符串(例如,开始、结束=“()”)


这是一个单行程序版本,基于@kindall的想法-但它根本不使用正则表达式!首先在“上拆分”,然后每隔一个项目拆分()并重新加入它们,这将处理空格:

stripWS = lambda txt:'"'.join( it if i%2 else ''.join(it.split())
    for i,it in enumerate(txt.split('"'))  )
用法示例:

>>> stripWS('This is a string with some "text in quotes."')
'Thisisastringwithsome"text in quotes."'

Oli,重新提出这个问题,因为它有一个简单的正则表达式解决方案,但没有提到。(在为一个项目做一些研究时发现了您的问题。)

下面是小正则表达式:

"[^"]*"|(\s+)
替换的左侧匹配完整的
“引号内的字符串”
。我们将忽略这些匹配。右侧匹配并捕获组1中的空格,我们知道它们是右侧空格,因为左侧的表达式不匹配它们

以下是工作代码(和一个):

参考


  • 这个问题是不明确的。当您有“a”和“b”作为输入时,它应该做什么?内容永远不会包含嵌套的引号,因此这不是issueStill,regex不适合此任务。您的示例给了我“Hello world这是一个测试”而不是“Hello”world这是“atest”@Oli:您可以使用
    map(pipes.quote,shlex.split(…)
    在必要时添加引号。我相信不久会有人来用一行列表替换它。:-)哈哈哈-我实际上错过了一行上的注释,直到我发布我的注释。不过我确实是基于你的想法++很抱歉,我只有一票赞成你的解决方案。我必须反对,删除带引号的字符串中的空格:
    “”。join(['''.join(it.split(''))如果我%2其他人支持我,则在enumerate(m.split(''))])
    "[^"]*"|(\s+)
    
    import re
    subject = 'Remove Spaces Here "But Not Here" Thank You'
    regex = re.compile(r'"[^"]*"|(\s+)')
    def myreplacement(m):
        if m.group(1):
            return ""
        else:
            return m.group(0)
    replaced = regex.sub(myreplacement, subject)
    print(replaced)