You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除表达式中运算符间的空格?shlex.shlex使用遇故障

解决方案:移除表达式中运算符间的空格并修复shlex问题

一、通用移除运算符空格的方法

使用正则表达式可以精准匹配并移除<、>、=、!这些运算符之间的任意空格,不管空格数量多少都能处理。

代码实现

import re

def remove_operator_spaces(expression):
    # 匹配两个运算符之间的所有空白字符并移除
    return re.sub(r'([<>=!])\s+([<>=!])', r'\1\2', expression)

测试示例

原始表达式:

( 'name' in ( "abc","bcd" )) and ( 'age' <  = 60 )

处理后输出:

( 'name' in ( "abc","bcd" )) and ( 'age' <= 60 )

这个正则会匹配所有[<>=!]符号后接空白、再接[<>=!]的情况,将中间空白直接删除,完美覆盖<=、>=、!=等组合的空格问题。

二、解决shlex插入运算符空格的问题

shlex默认会将<、>等符号视为分隔符,导致把<=拆成<和=并插入空格。解决这个问题有两种思路:

思路1:先修复运算符空格,再配置shlex不拆分运算符

修改shlex的wordchars属性,将<、>、=、!加入到单词字符集中,这样shlex会把这些符号组合当作一个完整token,不会拆分:

import shlex

original_expr = "( 'name' in ( \"abc\",\"bcd\" )) and ( 'age' <  = 60 )"
# 先修复运算符空格
fixed_expr = remove_operator_spaces(original_expr)

# 配置shlex不拆分运算符
lexer = shlex.shlex(fixed_expr, posix=True)
lexer.wordchars += '<>=!'  # 将运算符加入单词字符
lexer.whitespace_split = True

# 获取处理后的token列表
tokens = list(lexer)
# 如果需要重新拼接表达式
final_expr = ' '.join(tokens)

思路2:shlex处理后再次修复运算符空格

如果不想修改shlex配置,可以在shlex处理完成后,再调用一次remove_operator_spaces函数,清除shlex插入的运算符间空格:

import shlex
import re

def remove_operator_spaces(expression):
    return re.sub(r'([<>=!])\s+([<>=!])', r'\1\2', expression)

original_expr = "( 'name' in ( \"abc\",\"bcd\" )) and ( 'age' <  = 60 )"
# 先用shlex处理
lexer = shlex.shlex(original_expr, posix=True)
lexer.whitespace_split = True
processed_expr = ' '.join(list(lexer))

# 再修复运算符空格
final_expr = remove_operator_spaces(processed_expr)

两种方法都能解决shlex导致的运算符空格问题,根据自己的使用场景选择即可。

内容的提问来源于stack exchange,提问作者Therealhunter z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:22:40