【发布时间】:2021-01-21 21:51:51
【问题描述】:
我正在尝试编写一个正则表达式来将字符串拆分为我所说的“术语”(例如单词、数字和周围的空格)和“逻辑运算符”(例如
例如:
Frank and Bob are nice AND NOT (Henry is good OR Sam is 102 years old)
应该拆分成这个 Python 列表:
["Frank and Bob are nice", "AND", "NOT", "(", "Henry is good", "OR", "Sam is 102 years old", ")"]
我的代码:
pattern = r"(NOT|\-|\~)?\s*(\(|\[|\{)?\s*(NOT|\-|\~)?\s*([\w+\s*]*)\s+(AND|&|OR|\|)?\s+(NOT|\-|\~)?\s*([\w+\s*]*)\s*(\)|\]|\})?"
t = re.split(pattern, text)
raw_terms = list(filter(None, t))
该模式适用于这个测试用例,上面的一个,以及其他,
NOT Frank is a good boy AND Joe
raw_terms=['NOT', 'Frank is a good boy', 'AND', 'Joe']
但不是这些:
NOT Frank
raw_terms = ['NOT Frank']
NOT Frank is a good boy
raw_terms=['NOT Frank is a good boy']
我尝试将两个\s+ 更改为\s*,但并非所有测试用例都通过了。我不是正则表达式专家(这是我尝试过的最复杂的一个)。
我希望有人能帮助我理解为什么这两个测试用例会失败,以及如何修复正则表达式以使所有测试用例都通过。
谢谢,
标记
【问题讨论】:
标签: python-3.x regex python-re