如何批量自动还原含星号审查文本?替代繁琐str.replace方案
解决方案:用正则+预定义字典批量还原审查词
当然可以,正则完全能解决这个问题,而且能一次性批量处理所有审查变体,不用写一堆重复的replace语句。
实现思路
核心是给每个需要还原的词生成通用正则模式,匹配所有用*(或其他替换符)替换任意字符的变体,再结合预定义字典批量替换。还能通过回调函数保留原文本的大小写格式,贴合原文语境。
代码示例
import re # 定义需要还原的正确词(包含大小写、单复数变体) target_words = { "bastard": "bastard", "Bastard": "Bastard", "bastards": "bastards", "Bastards": "Bastards" } # 生成正则匹配规则:匹配每个词的所有带*替换的变体 patterns = [] for correct_word in target_words.values(): # 把每个字符转换成「原字符或任意数量*」的匹配单元 char_patterns = [f'(?:\\*+|{re.escape(c)})' for c in correct_word.lower()] # 生成不区分大小写的正则对象 pattern = re.compile(''.join(char_patterns), re.IGNORECASE) patterns.append((pattern, correct_word)) def restore_censored_text(text): for pattern, correct_word in patterns: # 回调函数:根据匹配文本的大小写返回对应格式的正确词 def match_handler(match): matched = match.group(0) if matched.isupper(): return correct_word.upper() elif matched.istitle(): return correct_word.title() else: return correct_word.lower() text = pattern.sub(match_handler, text) return text # 测试用例 test_text = "That b*st*rd yelled at me! Those B*stards are out of line." print(restore_censored_text(test_text)) # 输出:That bastard yelled at me! Those Bastards are out of line.
扩展说明
- 如果需要支持其他替换符(比如
#、?),只需要把正则里的\\*+改成[\\*#?]+即可。 - 如果要处理更多词汇,只需要在
target_words里添加对应的正确词,不需要修改其他逻辑。
内容的提问来源于stack exchange,提问作者Archibald Addelton
相关产品推荐
相关产品推荐

