给出与此类似的字符串:
string = "!([!x0]|[x1&x2])"
我正在编写一个匹配任何xi的正则表达式,其中i是给定范围内的数字,即不后跟|或者&或)或]
r'x[0-range](?![\|\&\)\]])'
它有效,除非xi在字符串的末尾:
string = "x0&x1"
匹配“x1”,这是不需要的。不知道如何修改这个。帮助
答案 0 :(得分:0)
首先,请注意range
中的[0-range]
只能是一位数字,因为它是[单个] 字符,所以它不会用于2位数的数字类。
接下来,负向前瞻允许在字符串的末尾隐式匹配,也就是说,如果你没有在前瞻中指定|$
(或类似的)替代方案。
因此,您可以将(?![\|\&\)\]])
转换为(?![\|\&\)\]]|$)
(或者,因为re
- \Z
指定了Python (?![\|\&\)\]]|\Z)
中字符串的最末端
在正则表达式模式中使用替换是没有效率的,还有另一种方法可以帮助您实现所需而无需添加替代方法:将带有正字符类的负向前瞻转换为带有否定的正向前瞻字符类。
在这种情况下,(?![\|\&\)\]])
变为(?=[^\|\&\)\]])
,即我们要求必须包含|
,&
,)
或{之外的字符{1}}紧靠当前位置的右侧。
请注意,在Python正则表达式模式中,]
模式可以在没有反斜杠的情况下编写:(?=[^\|\&\)\]])
。如果您对此不满意,请记住,您可能只需要在字符类((?=[^]|&)])
)内转义]
,\
,^
和-
永远逃脱。)