2016-12-08 90 views
4

我很難搞清楚如何用''替代每個空白區域,免除" "之間的差距。正則表達式 - 替換特定的字符exept特定的字符串

例如 -

a = c + d; 

a=c+d 

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

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

我曾嘗試類似

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

但顯然不起作用。

+0

是否有任何嵌套引用的子字符串,你需要考慮?我懷疑''''裏面也可以使用雙引號,對吧? –

+1

@michal你知道https://regex101.com/,包含python解釋器 –

+0

你的要求是你必須使用正則表達式嗎? –

回答

4

查找:

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

替換:

r'\1' 

的想法是忽略引號中的所有字符,通過先用東西在裏面(".*?")匹配所有的報價,並與更換相同(\1)。

我們知道剩下的空格(\s+)不會在引號內(或者第一個規則會與它們匹配),並用空白替換這些空格。


See it in action

+0

'g'應該被刪除。 –

+0

@WiktorStribiżew,完成。 :) – ndn

+0

我試過're.sub('r「(\」。*?\「)|(+)」g','$ 1',line)'on line = \t let length = Keyboard.readInt(「多少數字?」);',但那沒有做任何事情。 '讓$ 1length $ 1 = $ 1Keyboard.readInt($ 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");' 
+0

我覺得有一個更pythonic這樣做的方式(除正則表達式),但無法弄清楚。我接受建議。 –

相關問題