如何用Python或Regex实现didn't后至标点前词添加NOT_的分词处理
嘿,这个需求用Python正则配合回调函数就能轻松搞定,我给你拆解下思路和具体代码:
实现思路
核心逻辑分两步走:
- 精准定位
didn't到下一个标点符号之间的文本片段 - 对这个片段里的每个单词前缀添加
NOT_
具体代码实现
import re def add_not_prefix(match): # 提取匹配到的三个分组:didn't、中间待处理文本、结尾标点 didnt_part = match.group(1) content = match.group(2) punctuation = match.group(3) # 把中间文本里的每个单词替换成NOT_开头的形式 processed_content = re.sub(r'\b(\w+)\b', r'NOT_\1', content) # 拼接回完整的片段 return f"{didnt_part}{processed_content}{punctuation}" # 测试句子 original_sentence = "I didn't like that SO question, but I like pizza!" processed_sentence = re.sub(r"(didn't)([^.,!?]+)([.,!?])", add_not_prefix, original_sentence) print(processed_sentence) # 输出结果:I didn't NOT_like NOT_that NOT_SO NOT_question, but I like pizza!
代码细节解释
- 外层正则
r"(didn't)([^.,!?]+)([.,!?])":(didn't):精准匹配目标短语,作为第一组保留原内容([^.,!?]+):匹配除了, . ! ?之外的所有字符,也就是didn't到下一个标点之间的待处理内容,作为第二组([.,!?]):匹配后续的标点符号,作为第三组保留原内容
- 回调函数
add_not_prefix:- 用内层正则
r'\b(\w+)\b'匹配第二组里的每个独立单词(\b是单词边界,\w+匹配字母数字组成的单词) - 把每个匹配到的单词替换成
NOT_\1(\1指代匹配到的原单词内容)
- 用内层正则
- 适配扩展:如果需要支持更多标点(比如分号、冒号),只需要修改正则里的标点集合,比如改成
[^.,!?;:]+和[.,!?;:]即可;如果句子里有多个didn't,代码也能自动处理每一处匹配。
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

