You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
解决方案

原代码存在以下问题:

  1. 正则表达式语法错误:开头的*无意义,且\s强制要求./空格后有空格,无法匹配b.k(parcel)这类无空格的情况
  2. 用re.findall获取结果后直接传给str.replace,但replace不接受列表参数
  3. 循环中修改的是临时变量i,没有更新原列表的元素
  4. 未判断行是否以)结尾,会处理不符合条件的行

修正后的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:55:27