如何修改Python正则函数实现指定条件下的代词前置标记
调整Python正则处理法语代词le/les的逻辑
需求说明
修改现有Python正则函数,处理法语代词le/les时需遵循以下规则:
- 仅当代词
le前最近的((PERS)...))序列与它间隔至少2个单词,或无前序((PERS)...))序列时,在le前添加(SINGULAR_PERS) - 仅当代词
les前最近的((PERS)...))序列与它间隔至少2个单词,或无前序((PERS)...))序列时,在les前添加(PLURAL_PERS)
输入输出示例
输入文本:
le ((VERB)empujé) hasta ((VERB)dejarle) en ese lugar. A ((PERS)Marcos) le ((VERB)dijeron) y luego le ((VERB)ayudo)
目标输出文本:
(SINGULAR_PERS) le ((VERB)empujé) hasta ((VERB)dejarle) en ese lugar. A ((PERS)Marcos) le ((VERB)dijeron) y luego (SINGULAR_PERS) le ((VERB)ayudo)
正则实现方案
利用正向否定预查实现规则,核心是匹配le/les时,先排除前面存在间隔少于2个单词的((PERS)...))的情况,符合条件再添加标记。
完整代码示例
import re text = "le ((VERB)empujé) hasta ((VERB)dejarle) en ese lugar. A ((PERS)Marcos) le ((VERB)dijeron) y luego le ((VERB)ayudo)" # 处理单数代词le pattern_le = r'(?<!\((PERS)[^)]+\)\s+le)(?<!\((PERS)[^)]+\)\s+\S+\s+le)\b(le)\b' result = re.sub(pattern_le, r'(SINGULAR_PERS) \3', text) # 处理复数代词les(按需启用) pattern_les = r'(?<!\((PERS)[^)]+\)\s+les)(?<!\((PERS)[^)]+\)\s+\S+\s+les)\b(les)\b' result = re.sub(pattern_les, r'(PLURAL_PERS) \3', result) print(result)
正则逻辑拆解
(?<!\((PERS)[^)]+\)\s+le):否定预查,排除((PERS)...))直接紧跟空格+le(间隔0个单词)的情况(?<!\((PERS)[^)]+\)\s+\S+\s+le):否定预查,排除((PERS)...))后跟1个单词+空格+le(间隔1个单词)的情况- 两个预查结合,确保匹配的
le要么无前序((PERS)...)),要么与最近的((PERS)...))间隔至少2个单词
验证结果
运行代码后输出与目标示例完全一致:
(SINGULAR_PERS) le ((VERB)empujé) hasta ((VERB)dejarle) en ese lugar. A ((PERS)Marcos) le ((VERB)dijeron) y luego (SINGULAR_PERS) le ((VERB)ayudo)
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

