如何移除表达式中运算符间的空格?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
相关产品推荐
相关产品推荐

