首页 > 解决方案 > 如何在正则表达式的括号中获取分号

问题描述

对于以下C 源代码片段:

for (j=0; j<len; j++) a = (s) + (4); test = 5;

我想\n在分号之后插入,;除了使用python代码正则表达式模块的括号。

对于以下 C 源代码片段:

for (j=0; j<(len); (j++)) a = (s) + (4); test = 5;

正则表达式;(?![^(]*\))有效,但不适用于第一段代码

标签: pythonregex

解决方案


您需要计算每个正则表达式匹配的开括号和闭括号,如果开括号多于闭括号,则仅插入换行符。这是在replacement() 中完成的,它在正则表达式的每个匹配项上调用。正则表达式搜索“(”和“)”只是为了计数,搜索“;” 离开它或插入换行符

import re

def replacement(matched_list):
    global bracket_count
    matched_char=matched_list.group(1)
    if "(" in matched_char:
        bracket_count += 1
        # don't replace, just return what was found
        return matched_char 
    elif ")" in matched_char:
        bracket_count -= 1
        # don't replace, just return what was found
        return matched_char 
    elif ";" in matched_char:
        # if we're inside brackets, insert \n
        if bracket_count == 0:
            return ';\n'
        # if not, leave it intact
        else:
            return ';'

# example 1
bracket_count=0
code="for (j=0; j<len; j++) a = (s) + (4); test = 5;"
new_code = re.sub('([();] ?)', replacement, code)
print(code)
print(new_code)

# example 2
bracket_count=0
code="for (j=0; j<(len); (j++)) a = (s) + (4); test = 5;"
new_code = re.sub('([();])', replacement, code)
print(code)
print(new_code)

# example 3
bracket_count=0
code="for (j=0; j<len; j++) test = 5; a = (s) + (4);"
new_code = re.sub('([();])', replacement, code)
print(code)
print(new_code)

结果:

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++)) a = (s) + (4); test = 5;
for (j=0; j<(len); (j++)) a = (s) + (4);
test = 5;

推荐阅读