使用自定义replacement function:
re.sub(pattern, repl, string, count=0, flags=0)
...
如果repl 是一个函数,它会在pattern 的每个非重叠出现时调用。
函数 repl 每次出现单个 ; 时都会调用 and 用于括号表达式。由于re.sub 没有找到重叠序列,因此第一个左括号将触发完全匹配,一直到最后一个右括号。
import re
def repl(m):
contents = m.group(1)
if '(' in contents:
return contents
return ';\n'
str1 = 'for (j=0; j<len; j++) a = (s) + (4); test = 5;'
str2 = 'for (j=0; j<(len); (j++)) a = (s) + (4); test = 5;'
print (re.sub (r'(;\s*|\(.*\))', repl, str1))
print (re.sub (r'(;\s*|\(.*\))', repl, str2))
结果:
for (j=0; j<len; j++) a = (s) + (4);
test = 5;
for (j=0; j<(len); (j++)) a = (s) + (4);
test = 5;
任务完成,您的(非常少的)样本数据。
等一下!
其中一个示例中的一个小但有效的变化
str1 = 'for (j=0; j<len; j++) test = 5; a = (s) + (4);'
用错误的输出打破这个:
for (j=0; j<len; j++) test = 5; a = (s) + (4);
没有办法,你需要一个状态机来代替:
def state_match (text):
parentheses = 0
drop_space = False
result = ''
for character in text:
if character == '(':
parentheses += 1
result += '('
elif character == ')':
parentheses -= 1
result += ')'
elif character == ' ':
if not drop_space:
result += ' '
drop_space = False
elif character == ';':
if parentheses:
result += character
else:
result += ';\n'
drop_space = True
else:
result += character
return result
str1 = 'for (j=0; j<len; j++) a = (s) + (4); test = 5;'
str2 = 'for (j=0; j<(len); (j++)) a = (s) + (4); test = 5;'
str3 = 'for (j=0; j<len; j++) test = 5; a = (s) + (4);'
print (state_match(str1))
print (state_match(str2))
print (state_match(str3))
结果正确:
for (j=0; j<len; j++) a = (s) + (4);
test = 5;
for (j=0; j<(len); (j++)) a = (s) + (4);
test = 5;
for (j=0; j<len; j++) test = 5;
a = (s) + (4);