如何使用正则表达式按多分隔符(=, !=, >=等)拆分查询字符串
解决多操作符查询字符串拆分问题
问题核心
需要拆分包含=、!=、>、<、>=、<=这6种操作符的查询参数,关键是要把!=、>=、<=这类多字符操作符当成整体,而非拆成单个字符。
错误原因
之前用re.split('[=|!=|>|<=|>=|<]', param)的问题在于:[]是字符集,里面的所有字符(包括|、!)都会被当成单个匹配项,导致!=被拆成!和=两个分隔符,无法识别为整体操作符。
正确解决方案
步骤1:拆分整个查询字符串
先用&把整个字符串拆成单个参数项:
query_str = "book_id=123&start_date>=2023-09-12&end_date<=2023-09-14&status!=return" params = query_str.split('&')
步骤2:用正则匹配完整操作符
正则规则要优先匹配长操作符(把!=、>=、<=放在=、>、<前面),确保引擎先识别多字符操作符,再匹配单字符的。
方法1:用re.match提取键、操作符、值
import re # 正则模式:先匹配键(字母/数字/下划线),再匹配操作符,最后匹配值 pattern = re.compile(r'^(\w+)(!=|>=|<=|=|>|<)(.*)$') result = [] for param in params: match = pattern.match(param) if match: key, op, value = match.groups() result.append([key, op, value]) # 输出结果 print(result)
输出:
[['book_id', '=', '123'], ['start_date', '>=', '2023-09-12'], ['end_date', '<=', '2023-09-14'], ['status', '!=', 'return']]
方法2:用re.split保留操作符
通过捕获分组()把操作符保留在拆分结果中:
import re result = [] for param in params: # 用捕获分组拆分,保留操作符 parts = re.split(r'(!=|>=|<=|=|>|<)', param) # 过滤空字符串(避免异常情况) parts = [p for p in parts if p] if len(parts) == 3: result.append(parts)
关键注意事项
- 绝对不要用字符集
[]匹配多字符操作符,字符集仅适用于单个字符的匹配 - 正则中必须把长操作符放在前面,否则会出现
!=被拆成!和=的情况(比如先匹配=,剩下的!会被当成键的一部分)
内容的提问来源于stack exchange,提问作者Mohammed Mohideen M Z
相关产品推荐
相关产品推荐

