我试图建立一个捕获任何数字的正则表达式(整数,浮点数,科学记数法与否).我使用组,所以如果我需要更新的东西,我只更新一行.这是我正在做的事情:
intNumber = r"(?P<Integer>-?(0|[1-9]+[0-9]*))" # Integer floatNumber = r"(?P<Float>"+intNumber+r"\.[0-9]+)" # Float sciNumber = r"(?P<Scientific>"+floatNumber+r"(e|E)(-|\+)?[0-9]+)" # Scientific anyNumber = r"(?P<AnyNumber>"+sciNumber+"|(?P=Integer)|(?P=Float))" # Any number
问题在于虽然每个正则表达式都是独立运行的,但是当我将它们全部组合在anyNumber中时使用或(|)它只捕获科学记数字而不是其余部分.我究竟做错了什么?
编辑:为了改进我的问题,是否有可能有一个动态生成的正则表达式(目标是简单的单点维护),它也足够灵活,允许我单独使用它的组件,没有像重新定义组和方便命名的群体?我知道我可能会问太多..
解决方法
(?P = Integer)是一个命名的反向引用,它匹配与名为“Integer”的捕获组匹配的相同文本(不是递归组子模式!).与(?P = Float)相同.这意味着,您需要使用模式本身,而不是反向引用.
此外,如果您计划以这种方式动态构建正则表达式,则无法使用命名的反向引用.使用非捕获组,您的模式构建将类似于
import re intNumber = r"-?(?:0|[1-9]+[0-9]*)" # Integer floatNumber = intNumber+r"\.[0-9]+" # Float sciNumber = floatNumber+r"[eE][-+]?[0-9]+" # Scientific anyNumber = r"{0}|{1}|{2}".format(sciNumber,floatNumber,intNumber) # Any number print(re.findall(anyNumber,'12 12.34 12.34E-34'))