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”
(代表空格)。您是只使用空格,还是还想处理新行?是的。内引号可以是任何内容,应该忽略它。内引号可以是任何内容
它可以包含新行吗?否。任何可以与“+”匹配的内容都可以包含转义引号吗?此输入的预期输出是什么?