gpt4 book ai didi

regex - Python 正则表达式命名组

转载 作者:行者123 更新时间:2023-12-01 06:05:29 25 4
gpt4 key购买 nike

我试图构建一个捕获任何数字(整数、浮点数、是否使用科学记数法)的正则表达式。我使用组,所以如果我需要更新某些内容,我只更新一行。这是我在做什么:

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

关于regex - Python 正则表达式命名组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40241721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com