输入:
"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:]
是否有一种干净的可读方式来做同样的事情?
答案 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)
答案 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'