加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:46:47 所属栏目:百科 来源:网络整理
导读:我试图建立一个捕获任何数字的正则表达式(整数,浮点数,科学记数法与否).我使用组,所以如果我需要更新的东西,我只更新一行.这是我正在做的事情: intNumber = r"(?PInteger-?(0|[1-9]+[0-9]*))" # IntegerfloatNumber = r"(?PFloat"+intNumber+r".[0-9]+)" #
我试图建立一个捕获任何数字的正则表达式(整数,浮点数,科学记数法与否).我使用组,所以如果我需要更新的东西,我只更新一行.这是我正在做的事情:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读