Python - 匹配{}字符之间的字符串,但不匹配{{}}之间的字符串

时间:2013-05-02 00:14:38

标签: python regex string match

我正在尝试匹配html文档中的一些变量名来填充字典。我有html

<div class="no_float">
    <b>{node_A_test00:02d}</b>{{css}}
    <br />
    Block mask: {block_mask_lower_node_A} to {block_mask_upper_node_A}
    <br />
</div>
<div class="sw_sel_container">
    Switch selections: 
    <table class="sw_sel">
        <tr>
            <td class="{sw_sel_node_A_03}">1</td>
            <td class="{sw_sel_node_A_03}">2</td>
            <td class="{sw_sel_node_A_03}">3</td>
            <td class="{sw_sel_node_A_04}">4</td>
            <td class="{sw_sel_node_A_05}">5</td>

我希望匹配{和(}或:)之间的代码。但是,如果它以{{我根本不想匹配它(我将使用它用于内联css}}开始

到目前为止,我有正则表达式

(?<=\{)((?!{).*?)(?=\}|:)

但这仍然匹配{{css}}内的文字。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

re.findall(r'''
    (?<!\{)    # No opening bracket before
    \{         # Opening bracket
      ([^}]+)  # Stuff inside brackets
    \}         # Closing bracket
    (?!\})     # No closing bracket after
''', '{foo} {{bar}} {foo}', flags=re.VERBOSE)

答案 1 :(得分:0)

这似乎有效:

(?<=(?<!{){)[^{}:]+

这是一个捕获:

(?<!{){([^{}:]+)

答案 2 :(得分:0)

我看到你已经找到了一个有效的解决方案,但我认为解释原始正则表达式的问题可能是值得的。

  • (?<=\{)表示{必须先于下一个匹配项。很公平。
  • ((?!{).*?)将匹配以{以外的字符开头的所有内容。好的,所以我们只匹配里面的大括号。好。

但现在考虑当你有两个开口大括号时会发生什么:{{bar}}。考虑子串barb之前的内容是什么?一个{bar{开头吗?不。所以正则表达式会认为这是匹配。

当然,您已阻止正则表达式与{bar}匹配,这就是如果您将(?!{)从模式中删除的原因,因为{bar}{开头{1}}。但是一旦正则表达式引擎确定{字符上没有有效匹配开始,它就会转到下一个字符 - b - 并看到匹配从那里开始。

现在,只是为了踢,这是我使用的正则表达式:

(?!<={){([^{}:]+)[}:](?!=})

  • (?!<{):匹配不应以{开头。
  • {:比赛以开放式大括号开始。
  • ([^{}:]+)分组所有不是开括号,近括号或冒号的内容。这是我们真正想要的比赛的一部分。
  • [}:]:用近括号或冒号结束比赛。
  • (?!}):匹配不应该跟}