Python按id=行模式排序文件 正则匹配报AttributeError解决
问题描述
现有包含如下内容的枚举类文件:
enum class Fruits(id: String) { BANANA(id = "banana"), LEMON(id = "lemon"), DRAGON_FRUIT(id = "dragonFruit"), APPLE(id = "apple"); }
需求为按照id = 对应的取值对文件内的枚举条目行排序,再用排序后的新行替换原有对应行内容。
编写Python脚本实现时,正则匹配目标行模式失败,运行抛出AttributeError: 'NoneType' object has no attribute 'group'错误,无法完成排序逻辑,原有错误脚本如下:
import re fruitsFile = '/home/genericpath/Fruits.txt' def sortFruitIds(): # this is an attempt to get/find the pattern, but it return an AttributeError: # 'NoneType' object has no attribute 'group' with open(fruitsFile, "r+") as f: lines = sorted(f, key=lambda line: str(re.search(r"(?<=id = )\s+", line))) for line in lines: f.write(line)
原有代码问题
- 正则规则错误:原正则
(?<=id = )\s+仅匹配id =后的空白字符,没有捕获引号内的实际id值;同时类定义行、结尾闭合行不存在id =字段,正则匹配结果为None,直接用于排序会触发异常 - 文件操作逻辑错误:使用
r+模式打开文件后未清空原有内容,直接写入排序后的内容会导致文件内容重复、结构错乱 - 排序范围错误:没有区分枚举条目行和类定义、闭合行,会将非枚举条目行也纳入排序,破坏枚举类的基础结构
修复后实现
import re fruitsFile = '/home/genericpath/Fruits.txt' def sortFruitIds(): # 匹配id = 后双引号包裹的实际取值 id_extract_pattern = re.compile(r'id\s*=\s*"([^"]+)"') header = "" enum_items = [] footer = "" # 读取文件拆分结构 with open(fruitsFile, "r", encoding="utf-8") as f: all_lines = [line.rstrip("\n") for line in f if line.strip()] header = all_lines[0] footer = all_lines[-1] enum_items = all_lines[1:-1] # 按id值对枚举条目排序 enum_items.sort(key=lambda line: id_extract_pattern.search(line).group(1)) # 拼接内容写回文件 final_content = [header] + enum_items + [footer] with open(fruitsFile, "w", encoding="utf-8") as f: f.write("\n".join(final_content) + "\n") if __name__ == "__main__": sortFruitIds()
运行脚本后,文件内枚举会按id字段的字母序排序,结果如下:
enum class Fruits(id: String) { APPLE(id = "apple"), BANANA(id = "banana"), DRAGON_FRUIT(id = "dragonFruit"), LEMON(id = "lemon"); }
内容的提问来源于stack exchange,提问作者Lucas Fernandes
相关产品推荐
相关产品推荐

