当两个字符串之间的字符串时,正则表达式不匹配

时间:2016-04-05 08:07:58

标签: python regex

我在python中有以下解析方案,有行的情况:

  1. {{ name xxxxxxCONTENTxxxxx /}}
  2. {{ name }} xxxxxxxCONTENTxxxxxxx {{ name /}}
  3. {{ name xxxxxxCONTENTxxx {comand} xxxxCONTENTxxx /}}
  4. 我需要做的就是使用正则表达式对给定行所属的情况进行分类。

    我可以成功地在1)和2)之间进行分类,但很难处理3)。

    要抓住1)我使用:

    re.match('\s*{{[^{]*?/}}\s*',line)
    

    抓住2)我用:

    re.match('{{.*?}}',line)
    

    然后引发一个标志以保持上下文(因为案例2)可以超过多行。我怎么能抓住案例3)?

    我目前正在尝试匹配的条件是测试:

    - start with '{{'
    - end with '/}}'
    - with no '{{' in between
    

    但是我很难用正则表达式来表达这一点。

1 个答案:

答案 0 :(得分:1)

条件:

- start with '{{'
- end with '/}}'
- with no '{{' in between

非常适合tempered greedy token

^{{(?:(?!{{|/}}).)*/}}$
   ^^^^^^^^^^^^^^^^

请参阅regex demo

(?:(?!{{|/}}).)*匹配任何非{{/}}的文字(因此与第一个/}}匹配)。锚点(^$)仅允许匹配以{{开头并以/}}结尾且内部没有{{的整个字符串。请注意,对于re.match,您不需要^锚点。

现在,仅匹配第三种类型的字符串,您需要指定您的模式应该{....}

^{{(?:(?!{{|/}}).)*{[^{}]*}(?:(?!{{|/}}).)*/}}$
   | ----  1 -----|| - 2 -||--------1-----|

请参阅another regex demo

第1部分是上面描述的驯化贪婪令牌,而{[^{}]*}匹配单个{...}子字符串,使其在输入中成为必需的。