0

I'm trying to match some variable names in a html document to populate a dictionary. I have the 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>

I want to match code between { and ( } or : ). But if it starts with {{ I don't want to match it at all (I will be using this for inline css}

so far I have the regex expression

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

but this is still matching text inside {{css}}.

4

3 回答 3

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)
于 2013-05-02T00:20:20.333 回答
0

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

  • (?<=\{)意味着 a{必须在接下来的任何匹配之前。很公平。
  • ((?!{).*?)将匹配以 . 以外的字符开头的任何内容{。好的,所以我们只匹配大括号内的东西。好的。

但是现在考虑一下当你有两个左大括号时会发生什么:{{bar}}. 考虑子字符串bar。前面是b什么?一个{。是否bar以 开头{?没有。所以正则表达式会认为这是一个匹配项。

当然,您已经阻止了正则表达式匹配{bar},如果您将模式排除在外,这就是它会做的事情(?!{),因为{bar}{. 但是,一旦正则表达式引擎确定该{字符没有有效匹配开始,它就会移动到下一个字符b--并看到匹配从那里开始。

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

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

  • (?!<{): 比赛前不应有{.
  • {: 比赛以开括号开始。
  • ([^{}:]+):所有不是左大括号、右大括号或冒号的内容分组。这是我们真正想要的匹配部分。
  • [}:]: 以大括号或冒号结束匹配。
  • (?!}): match 后面不应该跟}.
于 2013-05-02T00:58:39.197 回答
0

这似乎有效:

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

这有一个捕获:

(?<!{){([^{}:]+)
于 2013-05-02T00:32:42.230 回答