如果没有,如何优雅地在子字符串周围添加空格?

时间:2015-02-10 15:37:37

标签: python regex string

输入:

"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:]

是否有一种干净的可读方式来做同样的事情?

4 个答案:

答案 0 :(得分: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)否定前瞻,断言匹配后面跟一个空格字符。

答案 1 :(得分:3)

这是一个不需要正则表达式的解决方案:

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

答案 2 :(得分:2)

或使用此模式并替换为空格

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

Demo

答案 3 :(得分:1)

如果您想复杂化,可以str.replace

>>> str = "bla&&bla...bla &&bla...bla&& bla...bla && bla"
>>> str.replace('&&',' && ').replace('  &&',' &&').replace('&&  ','&& ')
'bla && bla...bla && bla...bla && bla...bla && bla'