我正在尝试匹配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}}内的文字。
答案 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}}
。考虑子串bar
。 b
之前的内容是什么?一个{
。 bar
以{
开头吗?不。所以正则表达式会认为这是匹配。
当然,您已阻止正则表达式与{bar}
匹配,这就是如果您将(?!{)
从模式中删除的原因,因为{bar}
以{
开头{1}}。但是一旦正则表达式引擎确定{
字符上没有有效匹配开始,它就会转到下一个字符 - b
- 并看到匹配从那里开始。
现在,只是为了踢,这是我使用的正则表达式:
(?!<={){([^{}:]+)[}:](?!=})
(?!<{)
:匹配不应以{
开头。{
:比赛以开放式大括号开始。([^{}:]+)
:分组所有不是开括号,近括号或冒号的内容。这是我们真正想要的比赛的一部分。[}:]
:用近括号或冒号结束比赛。(?!})
:匹配不应该跟}
。