Python正则问题:如何替换列表中符合特定规则的函数调用名称?
问题
需要处理给定的字符串列表,满足以下规则:
- 仅处理以
)结尾的行 - 将行中位于**
.或空格之后、(之前**的单词替换为function_call
现有代码无法得到预期输出:
import re data = ["int k = b.k(parcel)", "int k = kon(parcel)", "int a", "int bds", "obtain.appendFrom(parcel, dataPosition2, readInt2)", "obtain desFrom(package, dataPosition2, readInt2)", "int abd(callme)", "int.dbd(callyou)", "int throw new UnsupportedOperationException(you)", "int throw new.UnsupportedOperationException(me)"] for i in data: para = re.findall(r"*[ \.]\s(\w+)\s*[)]" ,i) # start from space and dot and endwith ")" i = i.replace(para,"function_call") for i in data: print(i)
期望输出
int k = b.function_call(parcel) int k = function_call(parcel) int a int bds obtain.function_call(parcel, dataPosition2, readInt2) obtain function_call(package, dataPosition2, readInt2) int function_call(callme) int.function_call(callyou) int throw new function_call(you) int throw new.function_call(me)
解决方案
原代码存在以下问题:
- 正则表达式语法错误:开头的
*无意义,且\s强制要求./空格后有空格,无法匹配b.k(parcel)这类无空格的情况 - 用
re.findall获取结果后直接传给str.replace,但replace不接受列表参数 - 循环中修改的是临时变量
i,没有更新原列表的元素 - 未判断行是否以
)结尾,会处理不符合条件的行
修正后的代码:
import re data = ["int k = b.k(parcel)", "int k = kon(parcel)", "int a", "int bds", "obtain.appendFrom(parcel, dataPosition2, readInt2)", "obtain desFrom(package, dataPosition2, readInt2)", "int abd(callme)", "int.dbd(callyou)", "int throw new UnsupportedOperationException(you)", "int throw new.UnsupportedOperationException(me)"] # 遍历列表并修改元素 for idx, line in enumerate(data): # 仅处理以")"结尾的行(先strip避免末尾空格影响判断) if line.strip().endswith(')'): # 正则匹配:保留空格/点,替换其后的函数名为function_call modified_line = re.sub(r"([\s\.])\w+(?=\()", r"\1function_call", line) data[idx] = modified_line # 输出结果 for line in data: print(line)
代码说明
- 使用
enumerate遍历列表,同时获取索引和元素,方便直接修改原列表内容 - 用
line.strip().endswith(')')精准判断需要处理的行 - 正则表达式
([\s\.])\w+(?=\():([\s\.]):捕获空格或.作为分组,替换时保留原分隔符\w+:匹配由字母、数字、下划线组成的函数名(?=\():正向预查确保匹配的单词后紧跟(,避免误匹配其他无关单词
re.sub直接完成替换操作,将匹配片段替换为「原分隔符+function_call」
内容的提问来源于stack exchange,提问作者ya xi er
相关产品推荐
相关产品推荐

