作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是转动一个看起来像这样的字符串。
"a OR (b AND c)"
into
a OR bc
如果表达式类似于
"a AND (b OR c)"
then gives
ab OR ac
我无法使用 REGEX 匹配来设计一组正确的循环。问题的关键在于代码必须完全通用,因为我无法假设字符串模式有多长,也无法假设模式中 OR AND 的确切位置。
如果我这样输入,它也会解决这种类型的表达式。
最佳答案
Imo,您需要在这里使用解析器,例如PLY
。您需要定义所有的 block ,然后可以构建一个语法树,您可以用它做任何您想做的事情。
一个例子可以是:
import ply.lex as lex
# List of token names. This is always required
tokens = (
'VARIABLE',
'WHITESPACE',
'OR',
'AND',
'NOT',
'PAR_OPEN',
'PAR_CLOSE',
)
# Regular expression rules for simple tokens
t_VARIABLE = r'\b[a-z]+\b'
t_WHITESPACE = r'\s+'
t_OR = r'\bOR\b'
t_AND = r'\bAND\b'
t_NOT = r'\bNOT\b'
t_PAR_OPEN = r'\('
t_PAR_CLOSE = r'\)'
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
# Build the lexer
lexer = lex.lex()
lexer.input("a OR (b AND c)")
while True:
token = lexer.token()
if not token:
break
else:
print(token)
这会产生
LexToken(VARIABLE,'a',1,0)
LexToken(WHITESPACE,' ',1,1)
LexToken(OR,'OR',1,2)
LexToken(WHITESPACE,' ',1,4)
LexToken(PAR_OPEN,'(',1,5)
LexToken(VARIABLE,'b',1,6)
LexToken(WHITESPACE,' ',1,7)
LexToken(AND,'AND',1,8)
LexToken(WHITESPACE,' ',1,11)
LexToken(VARIABLE,'c',1,12)
LexToken(PAR_CLOSE,')',1,13)
它甚至可以使用嵌套括号,然后您可以分析较小的部分(例如从 PAR_OPEN
到 PAR_CLOSE
等)。
关于python - 简化 AND OR bool 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54230139/
我是一名优秀的程序员,十分优秀!