正则表达式:应该出现一个字符,然后是另一个转义字符

时间:2016-07-08 04:38:46

标签: python regex backslash findall

我正在寻找搜索模式。在另一种模式中不应该遵循特定的模式。不知何故,如果存在此模式,则<>个字符后面应跟有\个字符。如果字符不在模式中,则可以存在字符。

我尝试过这样做: 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>']

1 个答案:

答案 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>作为最小有效匹配的示例