解决re.sub类型报错:让REReplacer支持列表/嵌套列表输入
解决方案
要让这个类支持列表(包括嵌套列表)输入,核心思路就是递归遍历处理每个元素——遇到列表就拆开来逐个处理,遇到字符串就执行原有的替换逻辑。
直接修改replace方法即可,无需额外将列表转为字符串,修改后的完整代码如下:
import re # 示例替换规则(请替换为你实际的R_patterns定义) R_patterns = [ (r'oranges', 'apples'), (r'like', 'love') ] class REReplacer(object): def __init__(self, pattern = R_patterns): self.pattern = [(re.compile(regex), repl) for (regex, repl) in pattern] def replace(self, text): # 递归处理列表/嵌套列表 if isinstance(text, list): return [self.replace(item) for item in text] # 处理字符串类型的核心替换逻辑 s = text for (pattern, repl) in self.pattern: s = re.sub(pattern, repl, s) return s
测试示例
调用时无论传入字符串、普通列表还是嵌套列表都能正常工作:
rep = REReplacer() # 字符串输入 print(rep.replace("I like oranges")) # 输出: I love apples # 普通列表输入 print(rep.replace(["I like oranges", "She hates bananas"])) # 输出: ["I love apples", "She hates bananas"] # 嵌套列表输入 print(rep.replace([["I like oranges"], ["He eats oranges", "We buy oranges"]])) # 输出: [["I love apples"], ["He eats apples", "We buy apples"]]
补充说明
- 递归逻辑会自动逐层拆解嵌套列表,直到处理到最底层的字符串元素,完美适配嵌套结构;
- 如果需要支持元组这类可迭代序列,可将判断条件改为
if isinstance(text, (list, tuple)),并返回对应类型(比如元组用tuple(self.replace(item) for item in text))。
内容的提问来源于stack exchange,提问作者Codingamethyst
相关产品推荐
相关产品推荐

