我正在尝试在python中编写一个正则表达式,它可以返回类似模式的组。以下是一些示例输入 -
class:('MF YY' or 'XX') and status:('Active' or 'Pending')
class:('MF YY' or 'XX') and status:('Active' or 'Pending') and available:1
available:1
available:1 or class:('MF YY' or 'XX' or 'YY')
* status:'Pending'
还有很多这样的组合。我希望输出格式如下 -
输入: class:('MF YY' or 'XX' or 'YY') and status:('Active' or 'Pending') or available:1
的输出:
group 1: class:('MF YY' or 'XX' or 'YY')
group 2: and
group 3: status:('Active' or 'Pending')
group 4: or
group 5: available:1
这是我写的正则表达式 -
(\w*\:\(.*?\))(?:\s*(and|or)*\s*)
这会让我回复 -
group 1: class:('MF YY' or 'XX')
group 2: and
我可以将正则表达式更改为 -
(\w*\:\(.*?\))(?:\s*(and|or)*\s*)+(\w*\:\(.*?\))
返回 -
group 1: class:('MF YY' or 'XX')
group 2: and
group 3: status:('Active' or 'Pending')
但是,如果添加更多表达式,我的上述方法将无法扩展。我尝试添加* / +用于重复,但这不起作用。
如何实现3种类型的重复模式 -
提前感谢所有帮助。
答案 0 :(得分:0)
我会使用或运算符(|
)捕获每个:
\w+:\([^)]+\)|\w+:'[^']+'|\w+:\S+|(?:and|or)
第一部分\w+:\([^)]+\)
获取field:('{something}' and/or {something} ...)
第二部分\w+:'[^']+'
获取field:'{something}'
第三部分\w+:\S+
获取field:{something}
最后一部分是操作员。
正则表达式从左到右工作,因此在尝试匹配第二,第三,第四等部分之前,始终检查第一部分。
将上述内容与re.findall
一起使用,以获取每个匹配项的列表。