我在python中有以下解析方案,有行的情况:
{{ name xxxxxxCONTENTxxxxx /}}
{{ name }} xxxxxxxCONTENTxxxxxxx {{ name /}}
{{ name xxxxxxCONTENTxxx {comand} xxxxCONTENTxxx /}}
我需要做的就是使用正则表达式对给定行所属的情况进行分类。
我可以成功地在1)和2)之间进行分类,但很难处理3)。
要抓住1)我使用:
re.match('\s*{{[^{]*?/}}\s*',line)
抓住2)我用:
re.match('{{.*?}}',line)
然后引发一个标志以保持上下文(因为案例2)可以超过多行。我怎么能抓住案例3)?
我目前正在尝试匹配的条件是测试:
- start with '{{'
- end with '/}}'
- with no '{{' in between
但是我很难用正则表达式来表达这一点。
答案 0 :(得分:1)
条件:
- start with '{{'
- end with '/}}'
- with no '{{' in between
^{{(?:(?!{{|/}}).)*/}}$
^^^^^^^^^^^^^^^^
请参阅regex demo。
(?:(?!{{|/}}).)*
匹配任何非{{
和/}}
的文字(因此与第一个/}}
匹配)。锚点(^
和$
)仅允许匹配以{{
开头并以/}}
结尾且内部没有{{
的整个字符串。请注意,对于re.match
,您不需要^
锚点。
现在,仅匹配第三种类型的字符串,您需要指定您的模式应该{....}
:
^{{(?:(?!{{|/}}).)*{[^{}]*}(?:(?!{{|/}}).)*/}}$
| ---- 1 -----|| - 2 -||--------1-----|
第1部分是上面描述的驯化贪婪令牌,而{[^{}]*}
匹配单个{...}
子字符串,使其在输入中成为必需的。