负向前瞻 - 字符串结束

时间:2018-01-09 21:37:51

标签: regex python-3.x

给出与此类似的字符串:

string = "!([!x0]|[x1&x2])"

我正在编写一个匹配任何xi的正则表达式,其中i是给定范围内的数字,即后跟|或者&或)或]

r'x[0-range](?![\|\&\)\]])'

它有效,除非xi在字符串的末尾:

string = "x0&x1"

匹配“x1”,这是不需要的。不知道如何修改这个。帮助

1 个答案:

答案 0 :(得分:0)

首先,请注意range中的[0-range]只能是一位数字,因为它是[单个] 字符,所以它不会用于2位数的数字类。

接下来,负向前瞻允许在字符串的末尾隐式匹配,也就是说,如果你没有在前瞻中指定|$(或类似的)替代方案。

因此,您可以将(?![\|\&\)\]])转换为(?![\|\&\)\]]|$)(或者,因为re - \Z指定了Python (?![\|\&\)\]]|\Z)中字符串的最末端

在正则表达式模式中使用替换是没有效率的,还有另一种方法可以帮助您实现所需而无需添加替代方法:将带有正字符类的负向前瞻转换为带有否定的正向前瞻字符类

在这种情况下,(?![\|\&\)\]])变为(?=[^\|\&\)\]]),即我们要求必须包含|&)或{之外的字符{1}}紧靠当前位置的右侧。

请注意,在Python正则表达式模式中,]模式可以在没有反斜杠的情况下编写:(?=[^\|\&\)\]])。如果您对此不满意,请记住,您可能只需要在字符类((?=[^]|&)]))内转义]\^-永远逃脱。)