下面我发布了一个不依赖正则表达式的解决方案。它使用堆栈 (list) 来确定字符是否在花括号 { 内。正则表达式更优雅,但是,当需求发生变化时,它们可能更难修改。请注意,下面的示例也适用于嵌套括号。
text = "a,b,{'c','d','e','f'},g,h"
output=''
stack = []
for char in text:
if char == '{':
stack.append(char)
elif char == '}':
stack.pop()
#Check if we are inside a curly bracket
if len(stack)>0 and char==',':
output += ';'
else:
output += char
print output
这给出了:
'a,b,{'c';'d';'e';'f'},g,h
如果您使用stack 的全局变量,您也可以将其重写为map 函数:
stack = []
def replace_comma_in_curly_brackets(char):
if char == '{':
stack.append(char)
elif char == '}':
stack.pop()
#Check if we are inside a curly bracket
if len(stack)>0 and char==',':
return ';'
return char
text = "a,b,{'c','d','e','f'},g,h"
print ''.join(map(str, map(replace_comma_in_curly_brackets,text)))
关于性能,在本文末尾的测试字符串上运行上述两种方法和@stribizhev 提出的正则表达式解决方案时,我得到以下时序:
- 正则表达式 (@stribizshev):0.38 秒
- 地图功能:26.3秒
- For 循环:251 秒
这是 55,300,00 个字符长的测试字符串:
text = "a,able,about,across,after,all,almost,{also,am,among,an,and,any,are,as,at,be,because},been,but,by,can,cannot,could,dear,did,do,does,either,else,ever,every,for,from,get,got,had,has,have,he,her,hers,him,his,how,however,i,if,in,into,is,it,its,just,least,let,like,likely,may,me,might,most,must,my,neither,no,nor,not,of,off,often,on,only,or,other,our,own,rather,said,say,says,she,should,since,so,some,than,that,the,their,them,then,there,these,they,this,tis,to,too,twas,us,wants,was,we,were,what,when,where,which,while,who,whom,why,will,with,would,yet,you,your" * 100000