我正在寻找搜索模式。在另一种模式中不应该遵循特定的模式。不知何故,如果存在此模式,则<
和>
个字符后面应跟有\
个字符。如果字符不在模式中,则可以存在字符。
我尝试过这样做:
input_string = '<First tag:<Second tag:hello>tag ends>'
re.findall('(?<!\\)<.*?:.*?(?<!\\)>',input_string)
预期输出:
['<Second tag:hello>']
我得到的是:
['<First tag:<Second tag:hello>']
我试过这种模式:
(?<!\\)<[^(?<!\\)<.*:]+:[^(?<!\\)<.*:]+?(?<!\\)>
这会传递上面的示例,但对于此输入:
input_str = '<First tag:\<Second tag:hello>tag ends> <First tag:<Second tag:hello\>tag ends> <First tag:\<Second tag:hello\>tag ends>'
它失败了。
这是预期的输出:
['<First tag:\<Second tag:hello>','<Second tag:hello\>tag ends>','<First tag:\<Second tag:hello\>tag ends>']
答案 0 :(得分:0)
(?<!\\)<(?:[^<>]|\\<|\\>)+:(?:[^<>]|\\<|\\>)*[^\\]>
给出:
$1 - <First tag:\<Second tag:hello>
$1 - <Second tag:hello\>tag ends>
$1 - <First tag:\<Second tag:hello\>tag ends>
第二个例子:
故障:
(?<!\\)
背后的负面看法 - &gt;它不能以\
开头。
<
从左右括号开始
(?:
创建一个非捕获组:我想分组但我不想要其他组
[^<>] Any character that is not an angle bracket
| or
\\< An escaped left bracket
| or
\\> An escaped right bracket
)+
关闭群组...将其复制1次或更多次。
:
半结肠
(?:[^<>]|\\<|\\>)*
同一个非捕获组,0次或更多次。
[^\\]>
最后,除了\
后跟一个直角括号外,它必须以任何结尾。使用\\
是因为必须对其进行转义。
regex101链接,如果你想测试它。
此更新的正则表达式将接受:<a:a>
作为最小有效匹配的示例