2015-02-10 22 views
1

輸入:如何優雅地在子字符串周圍添加空格,如果沒有?

"bla&&bla...bla &&bla...bla&& bla...bla && bla" 

輸出:

"bla && bla...bla && bla...bla && bla...bla && bla" 

目前,我這樣做:

str = "if((a&&b)||c)"; 
wrong = "&&"; 
right = " && "; 

startFrom = 0 
wi = 0 
while wi != -1 
    wi = str.find(wrong, startFrom) 
    ri = str.find(right, startFrom) + 1 
    startFrom = wi + 1 
    if wi != ri 
     pre = wi - 1 
     post = wi + len(wrong) 
     if str[pre] != " " 
      str = str[:pre] + " " + str[pre:] 
     if str[post] != " " 
      str = str[:post] + " " + str[post:] 

是否有一個乾淨可讀的方式做同樣的事情?

+1

什麼是你期望的輸出更換? – 2015-02-10 15:38:12

回答

2

或使用該模式,以空格

(?<!\s)(?=&&)|(?<=&&)(?!\s) 

Demo

+0

太棒了!非常聰明,像這樣在正確的位置捕獲空串。讓我印象深刻。真的很喜歡這個答案。 – zehelvion 2015-02-16 12:01:19

+0

如果有人需要它,這裏是我用來捕獲我正在尋找的操作員的: 'r'(?<!\ s)(?=(== | && | >> | << | \ | \ |))|(?<=(==|&&|>> | << | \ | \ |))(?!\ s)'' – zehelvion 2015-02-16 12:15:14

3

這裏不需要正則表達式的解決方案:

str = "if((a&&b)||c)"; 
print ' && '.join([s.strip() for s in str.split('&&')]) 
5

好像你想是這樣的,

>>> s = "if((a&&b)||c) && b" 
>>> re.sub(r'(?<!\s)(&&)(?!\s)', r' \1 ', s) 
'if((a && b)||c) && b' 

上述正則表達式將只捕獲,如果它不早於&&字符串後面是一個空格。

更新:

>>> re.sub(r'\s*&&\s*', r' && ', 'bla&&bla...bla &&bla...bla&& bla...bla && bla') 
'bla && bla...bla && bla...bla && bla...bla && bla' 

OR

>>> re.sub(r'\s+&&(?!\s)|(?<!\s)&&\s+|(?<!\s)&&(?!\s)', r' && ', "bla&&bla...bla &&bla...bla&& bla...bla && bla") 
'bla && bla...bla && bla...bla && bla...bla && bla' 
  • (?<!\s)負回顧後,其斷言,這場比賽將不會被一個空格字符開頭。

  • (?!\s)消極的向前看,聲稱匹配不會跟隨空格字符。

+0

沒有繼續或mot遵循什麼?它取代它們全部是正確的? – zehelvion 2015-02-10 15:45:58

+0

看到我的upadte ... – 2015-02-10 15:46:51

1

如果你想複雜,你可以做str.replace

>>> str = "bla&&bla...bla &&bla...bla&& bla...bla && bla" 
>>> str.replace('&&',' && ').replace(' &&',' &&').replace('&& ','&& ') 
'bla && bla...bla && bla...bla && bla...bla && bla' 
相關問題