Python实现给字符串中多词短语添加引号(含括号场景)
给布尔查询中的多词短语自动添加双引号的正则方案
问题说明
需要将包含布尔运算符(AND/OR)和括号的查询字符串,如 jon doe AND (james OR james david),转换为给所有多词短语包裹双引号的格式:"jon doe" AND (james OR "james david")。非正则方法无法适配带括号的嵌套场景,这里提供简洁的正则实现方案。
正则实现思路
核心是匹配非布尔运算符、由多个空格分隔单词组成的连续字符序列,同时自动忽略括号的嵌套结构,无需额外处理括号逻辑。
代码实现(Python)
import re def wrap_multi_word_phrases(query): # 正则规则:匹配至少两个单词组成的短语,排除AND/OR运算符 regex_pattern = r'\b(?!AND\b|OR\b)([a-zA-Z]+(?:\s+[a-zA-Z]+)+)\b' return re.sub(regex_pattern, r'"\1"', query) # 测试示例 raw_query = 'jon doe AND (james OR james david)' formatted_query = wrap_multi_word_phrases(raw_query) print(formatted_query) # 输出:"jon doe" AND (james OR "james david")
正则规则解释
\b:单词边界,确保匹配的是完整的单词序列,避免部分匹配运算符或短语(?!AND\b|OR\b):负向预查,排除单独的AND/OR运算符,防止误包裹([a-zA-Z]+(?:\s+[a-zA-Z]+)+):捕获多词短语,(?:...)是非捕获组,用于匹配后续的空格+单词结构,确保至少有两个单词\b:结尾的单词边界,确保短语完整闭合
扩展适配
如果查询中包含数字、连字符等特殊字符,可调整正则的字符类,例如将 [a-zA-Z] 替换为 [a-zA-Z0-9-],适配更多场景:
regex_pattern = r'\b(?!AND\b|OR\b)([a-zA-Z0-9-]+(?:\s+[a-zA-Z0-9-]+)+)\b'
内容的提问来源于stack exchange,提问作者FightWithCode
相关产品推荐
相关产品推荐

