正则表达式 - 替换特定字符exept特定字符串

时间:2016-12-08 15:12:02

标签: python regex

我很难弄清楚如何用''替换每个空白区域,在" "之间发挥作用。

例如 -

a = c + d;

a=c+d

foo ("hi bye",        "bye    hi");

foo("hi bye","bye    hi");

我尝试了类似

的内容
re.sub('^(\"[^\"\n]*\")|\s|\\n', '', line)

但显然不起作用。

2 个答案:

答案 0 :(得分:4)

查找

r'(".*?")|(\s+)'

替换:

r'\1'

我们的想法是忽略引号内的所有字符,首先将所有引号与内部(".*?")匹配并替换为相同的\1)。

我们知道左边的空格(\s+)不会在引号内(或者第一个规则会匹配它们)并用空格替换这些空格。

See it in action

答案 1 :(得分:1)

由于您在评论中说不需要正则表达式,我将提出一个新概念:不要使用正则表达式

别误会我的意思。我喜欢正则表达式。它是一个了不起的强大工具,如果你愿意做出足够复杂的表达,它几乎可以处理你提出的任何问题。有时候正则表达式是一个完美的工具,并在一个简单的表达式中清理了几十行代码。

但这是一项简单的任务,取决于一个简单的事情:你需要一个状态,你是否在引用范围内。

这段代码是如此基本,人们甚至可能会说它不是pythonic。但它有效,任何人都可以阅读它。

def kill_spaces(test_str):
    inside_quote = False
    result = ""
    for character in test_str:
        if character != " " or inside_quote:
            result += character
        if character == '"':
            inside_quote = not inside_quote
    return result

test = 'foo ("hi bye",       "bye     hi");'
kill_spaces(test)
>>> 'foo("hi bye","bye     hi");'