有没有办法确定正则表达式是否只匹配固定长度的字符串?
我的想法是扫描*,+和?然后,需要一些智能逻辑来寻找{m,n},其中m!= n。
没有必要采取|操作员考虑在内。
小例子:^ \ d {4}是固定长度的; ^ \ d {4,5}或^ \ d +是可变长度
我正在使用PCRE。
感谢。
保罗·普拉特答案 0 :(得分:4)
好吧,你可以利用Python的正则表达式引擎只允许在后向断言中使用固定长度的正则表达式这一事实:
import re
regexes = [r".x{2}(abc|def)", # fixed
r"a|bc", # variable/finite
r"(.)\1", # fixed
r".{0,3}", # variable/finite
r".*"] # variable/infinite
for regex in regexes:
try:
r = re.compile("(?<=" + regex + ")")
except:
print("Not fixed length: {}".format(regex))
else:
print("Fixed length: {}".format(regex))
将输出
Fixed length: .x{2}(abc|def)
Not fixed length: a|bc
Fixed length: (.)\1
Not fixed length: .{0,3}
Not fixed length: .*
我假设正则表达式本身是有效的。
现在,Python如何知道正则表达式是否是固定长度的?只需阅读源代码 - 在sre_parse.py
中,有一个名为getwidth()
的方法,它返回一个由最低和最高可能长度组成的元组,如果这些元素在一个后备断言中不相等,{{1会引发错误。 re.compile()
方法递归地遍历正则表达式:
getwidth()
答案 1 :(得分:1)
只是为了好玩。
假设正则表达式我们只测试支持+
,*
,?
,{m,n}
,{n}
和[...]
(除了一些)奇怪的语法,如[]]
和[^]]
)。然后正则表达式只有在遵循语法时才是固定长度:
REGEX -> ELEMENT *
ELEMENT -> CHARACTER ( '{' ( \d+ ) ( ',' \1 )? '}' )?
CHARACTER -> [^+*?\\\[] | '\\' . | '[' ( '\\' . | [^\\\]] )+ ']'
可以在PCRE中重写为:
^(?:(?:[^+*?\\\[{]|\\.|\[(?:\\.|[^\\\]])+\])(?:\{(\d+)(?:,\1)?\})?)*$
答案 2 :(得分:0)
根据regular-expressions.info,PCRE引擎仅支持固定长度的正则表达式和外观内部的交替。
因此,如果你有一个有效的正则表达式,请用(?<=
和)
包围它,看看它是否仍在编译。然后你知道它是固定大小或固定大小的正则表达式的替代。
我不确定像a(b|cd)e
这样的东西 - 这绝对不是固定大小的,但它仍然可以编译。您需要尝试一下(我没有安装C / PCRE)。