Skip to main content
 首页 » 编程设计

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

2025年05月04日20JeffreyZhao

输入:

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

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

请您参考如下方法:

看来你想要这样的东西,

>>> 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' 

或

>>> 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)否定前瞻,断言匹配后不会跟空格字符。