正则表达式调理

时间:2015-03-24 04:46:30

标签: python regex

请考虑以下事项:

a;b{c;d;}e{f;}

如何将其拆分为三组,如下所示:

Group 1: a;
Group 2: b{c;d;}
Group 3: e{f;}

我正在学习正则表达式,我想知道是否可以在表达式中包含if-then-else类型逻辑。

我现在拥有的:

(.*?{.*?})

这样就创建了两个组:

Group 1: a;b{c;d;}
Group 2: e{f;}

这不是我想要的;并且b {c; d;}被合并。

伪if-then-else:

  1. 选择所有字符,直到分号或开卷 托架。
  2. 如果是分号,则停止并完成组。
  3. 否则,如果打开花括号,则继续选择所有字符 直到结束大括号。
  4. 感谢。

2 个答案:

答案 0 :(得分:2)

使用re.findall

>>> re.findall(r'[^;{]+;?(?:{[^}]*})?', 'a;b{c;d;}e{f;}')
['a;', 'b{c;d;}', 'e{f;}']

OR

这个更合适。

>>> re.findall(r'[^;{]+;|[^;{]+(?:{[^}]*})?', 'a;b{c;d;}e{f;}')
['a;', 'b{c;d;}', 'e{f;}']
  • [^;{]+否定了与任何字符匹配但不匹配;{一次或多次的字符类。

  • |

  • [^;{]+任何字符,但不是;或{后跟

  • (?:{[^}]*})?可选花括号块。

答案 1 :(得分:1)

(?<=;)(?![^{]*})|(?<=}(?!$))

您可以使用此功能与regex模块进行拆分,因为re不支持0 width assertions处的拆分。

import regex
x="a;b{c;d;}e{f;}"
print regex.split(r"(?<=;)(?![^{]*})|(?<=}(?!$))",x,flags=regex.VERSION1)

输出:['a;', 'b{c;d;}', 'e{f;}']

参见演示。

https://regex101.com/r/tJ2mW5/8#python