正则表达式 – Python正则表达式命名组

前端之家收集整理的这篇文章主要介绍了正则表达式 – Python正则表达式命名组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图建立一个捕获任何数字的正则表达式(整数,浮点数,科学记数法与否).我使用组,所以如果我需要更新的东西,我只更新一行.这是我正在做的事情:

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'))

Python demo

猜你在找的正则表达式相关文章