
本文介绍一种使用正则表达式精准提取并按词性(名词[ ]、动词( )、形容词{ })分类存储句子中目标词的Python方法,解决原始逻辑中因边界查找错误导致的误匹配问题。
本文介绍一种使用正则表达式精准提取并按词性(名词`[ ]`、动词`( )`、形容词`{ }`)分类存储句子中目标词的python方法,解决原始逻辑中因边界查找错误导致的误匹配问题。
在自然语言处理或文本标注任务中,常需从结构化标记文本(如 [Haus], (läuft), {schnell})中自动识别关键词及其句法角色。原始代码使用 str.find() 手动定位括号位置,存在严重缺陷:当某行不含目标括号时,find() 返回 -1,而切片操作 s[-1:end] 会意外截取字符串末尾内容,导致空键 '' 和跨类别误匹配(例如将 [Glas] 行错误归入 verbDict)。根本原因在于未校验括号是否存在即执行切片。
✅ 正确做法是:先检测标记是否存在,再安全提取内容。推荐使用 re.findall() 配合非贪婪捕获组,语义清晰且鲁棒性强:
import re
def getWordsSelected(sentences):
# 定义词性与对应括号的映射关系
word_categories = {
'verb': r'\(([^)]*)\)', # 匹配 (word)
'substantive': r'\[([^]]*)\]', # 匹配 [word]
'adjective': r'\{([^}]*)\}' # 匹配 {word}
}
# 初始化嵌套字典:category → {keyword: [(sentence, category), ...]}
result = {cat: {} for cat in word_categories}
for sentence in sentences:
for category, pattern in word_categories.items():
matches = re.findall(pattern, sentence)
for keyword in matches:
# 确保 keyword 非空(避免空括号 [] 或 () 导致的异常)
if keyword.strip():
result[category].setdefault(keyword, []).append((sentence, category))
return result
# 示例数据
sentences = [
"Es (duftete) nach Erde und Pilze",
"die [Wände] waren mit Moos überzogen.",
"Ihr zerrissenes [Gewand] war wieder wie neu",
"Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden",
"Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist."
]
# 执行分类
output = getWordsSelected(sentences)
print(output)
? 关键改进点说明:
- 正则精准捕获:r'\[([^]]*)\]' 明确匹配 [ 后至下一个 ] 前的所有字符(非贪婪),彻底规避 find() 的 -1 边界错误;
- 空值防护:if keyword.strip(): 过滤空括号(如 [])产生的空字符串;
-
结构统一:所有词性共用同一逻辑流程,便于扩展新类别(如添加副词
只需新增一行映射); - 返回结构化结果:直接返回嵌套字典,而非仅打印,方便后续合并或导出(如 json.dump(output, open('classified.json', 'w')))。
? 进阶提示:若需支持同一句子含多个同类标记(如 die [Tür] und [Wand]),当前 re.findall() 已天然支持;若需严格区分形容词/副词(原需求中 {mehr} 实为副词),可拆分 adjective 为 adjective 和 adverb 并定义独立模式。
该方案兼顾准确性、可维护性与扩展性,是处理带标记文本分类任务的推荐实践。










