如何修正Python代码以检测所有无变体的重音字符?
问题:检测无对应变体的重音字符并修复代码缺陷
需求
检测文本中无对应变体的重音字符,并触发错误提示。
现有代码
import re accents = ['é', 'à', 'è', 'ù', 'â', 'ê', 'î', 'ô', 'û', 'ç', 'ë', 'ï', 'ü'] with open("test.txt", 'r', encoding='UTF-8') as file: lines = [line.rstrip() for line in file] #print(line) for line in lines: for accent in accents: if accent in line: my_list = line.split(accent) #print(my_list) for x in my_list: if x[-1] == "(" or x[0] == "|" or x[-1] == "|" or x[0] == ")": pass else: print( "Error found on line:", lines.index(line)+1, ",", f'"{accent}"', "has no accent variation") my_list.pop(1)
测试文件(test.txt)内容
t(é|e)làphone|télephone|portland(e|é)
当前问题
代码仅能检测到t(é|e)làphone中的à,无法检测télephone中的é——因为该é拆分后内容触发了x[-1] == "|"的跳过条件,导致误判。
修复方案与实现思路
原代码的核心问题是通过字符串拆分+简单字符判断来识别变体结构,逻辑过于粗糙,无法准确区分“是否在合法变体组内”的重音字符。比如télephone里的é前面是|,但这个|属于不同分支的分隔符,不是变体组的一部分,原代码误将其当作合法变体跳过了。
更可靠的思路是:先识别文本中所有合法的变体结构(比如(é|e)或(e|é)这类格式),然后检查所有重音字符是否在这些合法结构内,不在的就触发错误。
具体实现代码
import re # 定义需要检测的重音字符集合 ACCENTS = {'é', 'à', 'è', 'ù', 'â', 'ê', 'î', 'ô', 'û', 'ç', 'ë', 'ï', 'ü'} # 正则匹配合法变体组:捕获括号内的变体内容,如(é|e)、(e|é) VARIATION_PATTERN = re.compile(r'\(([^)]+)\)') with open("test.txt", 'r', encoding='UTF-8') as file: for line_num, line in enumerate(file, start=1): line = line.rstrip() # 遍历所有合法变体组,记录它们的位置范围 valid_variation_ranges = [] for match in VARIATION_PATTERN.finditer(line): valid_variation_ranges.append(match.span()) # 检查行中每个重音字符是否在合法变体组内 for char_idx, char in enumerate(line): if char in ACCENTS: # 判断当前字符是否处于某个合法变体组的括号范围内 in_valid_group = False for start, end in valid_variation_ranges: if start < char_idx < end: in_valid_group = True break # 不在合法组内则输出错误 if not in_valid_group: print(f"Error found on line: {line_num}, \"{char}\" has no accent variation")
代码说明
- 正则定位变体组:用
\(([^)]+)\)匹配所有(xxx)格式的变体组,记录每个组的起止位置。 - 精准判断重音位置:遍历行中每个字符,遇到重音字符时,检查它是否处于某个变体组的括号范围内。
- 避免误判:只跳过处于合法变体组内的重音字符,其余无对应变体的重音都会触发错误提示。
测试结果
运行代码后会正确检测到两个错误:
- 第1行的
à(无对应变体) - 第1行的
é(télephone中的é无对应变体)
完全符合需求,不会出现原代码的误判情况。
内容的提问来源于stack exchange,提问作者alinapal
相关产品推荐
相关产品推荐

