Python正则表达式:如何将引号内内容视为整体避免拆分?
正则拆分需求:保留引号内内容为整体
现有Python代码如下,其中self.keywords是包含关键词的列表:
escaped_keywords = list(map(re.escape, self.keywords)) joined_keywords = '|'.join(escaped_keywords) pattern = rf"\b({joined_keywords})\b|([^\w\s])" temp = re.split(pattern, line)
当前正则处理带引号的字符串(如"hello, world!")时,会拆分成'"', 'hello', ',', 'world', '!', '"',但期望输出为'"', 'hello, world!', '"'——即把双/单引号内的内容视为整体,不拆分其中的符号。此前尝试"(.?)"|'(.?)'未达预期,求正确正则方案。
解决方案
核心是让引号内内容的匹配优先级最高,这样正则会先完整捕获引号里的内容,再处理其他规则。修改后的代码如下:
import re escaped_keywords = list(map(re.escape, self.keywords)) joined_keywords = '|'.join(escaped_keywords) # 优先匹配双/单引号内的完整内容,再匹配关键词,最后匹配引号外的符号 pattern = r'"([^"]*)"|\'([^\']*)\'|\b(' + joined_keywords + r')\b|([^\w\s])' temp = re.split(pattern, line) # 过滤拆分后产生的空值和None temp = [item for item in temp if item is not None and item != '']
规则细节
"([^"]*)":匹配双引号内所有内容(到下一个双引号为止),[^"]*确保不会跨引号匹配\'([^\']*)\':同理匹配单引号内的内容(注意转义单引号避免语法错误)\b(' + joined_keywords + r')\b:保留原有的关键词独立匹配规则([^\w\s]):仅匹配引号外的非单词、非空白字符
效果验证
输入"hello, world!"时,拆分结果为['"', 'hello, world!', '"'],完全符合预期;同时引号外的关键词和符号仍能正常拆分。
内容的提问来源于stack exchange,提问作者Silicon
相关产品推荐
相关产品推荐

