2015-02-10 54 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' 
相关问题