阅读量:0
import re def extract_labels_and_contents(text): # 构建正则表达式模式 pattern = re.compile(r'(\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\])(.*?)(?=\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\]|\Z)', re.DOTALL) # 查找所有匹配的标签和内容 matches = pattern.findall(text) # 将标签和中间内容分别存储在两个列表中 found_labels = [] contents = [] for match in matches: found_labels.append(match[0]) contents.append(match[1].strip()) # print("Found Labels:", found_labels) # print("Contents:", contents) combined_list = [{"text": text, "speaker": "sys", "strategy": label} for label, text in zip(found_labels, contents)] return combined_list # 示例文本 text = """ [SUP]您好,给您一个温暖的抱抱。[ANA]您这样是对的。 """ # 调用函数并打印结果 result = extract_labels_and_contents(text) print(result)
重点在于正则表达式
pattern = re.compile(r'(\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\])(.*?)(?=\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\]|\Z)', re.DOTALL)
在这个改进的正则表达式 (\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\])(.*?)(?=\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\]|\Z)
中:
(\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\])
匹配标签。(.*?)
非贪婪地匹配标签后的内容。(?=\[FAC\]|\[ADV\]|\[SUP\]|\[RES\]|\[ANA\]|\[EXP\]|\Z)
确保匹配到下一个标签开始的位置或文本末尾,\Z
表示文本末尾。
这种方式可以确保匹配所有标签及其对应的内容。