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,我有一个用例,我想用一个空格替换多个空格,除非它们出现在引号中。比如说 原创的 this is the first a b c this is the second "a b c" 之后 我相信正则表达式应该能够做到这一点,但我对它们没有太多经验。这是我已经有的一些代码 import re str = 'this is the second "a b c"' # Replace all multiple spaces with

我有一个用例,我想用一个空格替换多个空格,除非它们出现在引号中。比如说

原创的

this is the first    a   b   c
this is the second    "a      b      c"
之后

我相信正则表达式应该能够做到这一点,但我对它们没有太多经验。这是我已经有的一些代码

import re

str = 'this is the second    "a      b      c"'
# Replace all multiple spaces with single space
print re.sub('\s\s+', '\s', str)

# Doesn't work, but something like this
print re.sub('[\"]^.*\s\s+.*[\"]^, '\s', str)
我理解为什么我上面的第二个方法不起作用,所以我只希望有一些替代方法。如果可能的话,请您解释一下正则表达式解决方案的各个部分。谢谢假设
子字符串中没有

正则表达式
(“[^”]*”)|[\t]+
将匹配带引号的子字符串或一个或多个空格或制表符。因为正则表达式首先匹配带引号的子字符串,所以它内部的空格将无法被替代子模式
[\t]+
匹配,因此将被忽略

匹配引用子字符串的模式包含在
()
中,因此回调可以检查它是否匹配。如果是,
m.group(1)
将是真实的,它的值将简单地返回。如果没有,则匹配的是空白,因此返回一个空格作为替换值

没有拉姆达

def repl(match):
    quoted = match.group(1)
    return quoted if quoted else ' '

str = re.sub(r'("[^"]*")|[ \t]+', repl, str)
假设
“子字符串”

正则表达式
(“[^”]*”)|[\t]+
将匹配带引号的子字符串或一个或多个空格或制表符。因为正则表达式首先匹配带引号的子字符串,所以它内部的空格将无法被替代子模式
[\t]+
匹配,因此将被忽略

匹配引用子字符串的模式包含在
()
中,因此回调可以检查它是否匹配。如果是,
m.group(1)
将是真实的,它的值将简单地返回。如果没有,则匹配的是空白,因此返回一个空格作为替换值

没有拉姆达

def repl(match):
    quoted = match.group(1)
    return quoted if quoted else ' '

str = re.sub(r'("[^"]*")|[ \t]+', repl, str)

如果您想要一个每次都能可靠工作的解决方案,不管输入或其他警告(如不允许嵌入引号),那么您需要编写一个简单的解析器,而不使用RegExp或对引号进行拆分

def parse(s):
    last = ''
    result = ''
    toggle = 0
    for c in s:
        if c == '"' and last != '\\':
            toggle ^= 1
        if c == ' ' and toggle == 0 and last == ' ':
            continue
        result += c
        last = c
    return result

test = r'"  <  >"test   1   2   3 "a \"<   >\"  b  c"'
print test
print parse(test)
def解析:
最后=“”
结果=“”
切换=0
对于s中的c:
如果c=''“'和最后一个!='\\':
切换^=1
如果c==''和toggle==0和last='':
持续
结果+=c
最后=c
返回结果
测试=r'<>“测试1 2 3“a\”<>“b c”
打印测试
打印解析(测试)

如果您想要一个每次都能可靠工作的解决方案,不管输入或其他警告(如不允许嵌入引号),那么您需要编写一个简单的解析器,而不使用RegExp或对引号进行拆分

def parse(s):
    last = ''
    result = ''
    toggle = 0
    for c in s:
        if c == '"' and last != '\\':
            toggle ^= 1
        if c == ' ' and toggle == 0 and last == ' ':
            continue
        result += c
        last = c
    return result

test = r'"  <  >"test   1   2   3 "a \"<   >\"  b  c"'
print test
print parse(test)
def解析:
最后=“”
结果=“”
切换=0
对于s中的c:
如果c=''“'和最后一个!='\\':
切换^=1
如果c==''和toggle==0和last='':
持续
结果+=c
最后=c
返回结果
测试=r'<>“测试1 2 3“a\”<>“b c”
打印测试
打印解析(测试)

你会有这样的东西吗:
asdasdasd“asdasdasd\uuuuuuuu\asdajskd”
\uuuuu
代表空格)。你是只在空间里工作,还是你也想处理新的线路?是的。内引号可以是任何内容,应该忽略它
内引号可以是任何内容
它可以包含新行吗?否。任何可以与“.+”匹配的内容都可以包含转义引号吗?此输入的预期输出是什么?
“dd_uuuuuuuugg”\uuuuu sdf”
?是否有类似的内容:
asdasdasd“asdasdasd\uuuuuuuu asdajskd”
代表空格)。您是只使用空格,还是还想处理新行?是的。内引号可以是任何内容,应该忽略它。
内引号可以是任何内容
它可以包含新行吗?否。任何可以与“+”匹配的内容都可以包含转义引号吗?此输入的预期输出是什么?