我是正则表达式的新手,不知道该怎么问这个问题,但我会尽我所能.

下面是我正在使用的一个简单的表达式:

"^[0-9]{13}$"

这与正好13个字符长的数字字符串相匹配.根据Python文档,我可以设置这样的范围,以匹配长度在13到20个字符之间的任何数字字符串,例如:

"^[0-9]{13,20}$"

我的问题是,我如何从一个范围中排除某些"长度"?例如:

"^[0-9]{13,20 EXCEPT for 15 or 17}$"

在该示例中,我希望包括除15和17之外的13到20之间的任何长度.

这个是可能的吗?

我已经查看了Python3regex文档,我个人找不到一种方法来做到这一点,但我也没有使用它的经验,所以我可能忽略了一些东西.

推荐答案

在您的第二个模式中,您可以将字符串^的开头替换为custom/restricted^(?!(.{15}|.{17})$)(这是基于要排除的长度构建的).这将确保匹配字符串的每个开头,但前提是该字符串的长度不是15或17个字符.

Use ^(?!(.{15}|.{17})$)[0-9]{13,20}$ instead of ^[0-9]{13,20}$

下面是处理不同不连续范围的通用代码:

# feel free to adjust the values
(l, r), excep = [13, 20], [15, 17]

to_excl = "|".join(".{%s}" % n for n in excep)

pat = re.compile(r"^(?!(%s)$)[0-9]{%s,%s}$" % (to_excl, l, r))

测试/输出:

for t in text:
    print(
        f"{t:<22}", f"{len(t):<4}",
        "match" if pat.match(t) else "no-match"
    )
    
01234                  5    no-match
012345678901234        15   no-match
0123456789012345       16   match
01234567890123456      17   no-match
012345678901234567     18   match
012345678901234567890  21   no-match

使用的输入:

from string import digits
s = digits; lens = [5, 15, 16, 17, 18, 21]
text = [s * (l // 10) + s[:l % 10] for l in lens]
   
['01234',
 '012345678901234',
 '0123456789012345',
 '01234567890123456',
 '012345678901234567',
 '012345678901234567890']

Python相关问答推荐

为什么使用SciPy中的Distance. cos函数比直接执行其Python代码更快?

如何在Python中增量更新DF

如何使用bs 4从元素中提取文本

如何修复使用turtle和tkinter制作的绘画应用程序的撤销功能

按照行主要蛇扫描顺序对点列表进行排序

使用polars .滤镜进行切片速度比pandas .loc慢

如何根据日期和时间将状态更新为已过期或活动?

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

Pandas 第二小值有条件

运行回文查找器代码时发生错误:[类型错误:builtin_index_or_system对象不可订阅]

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

如何检测背景有噪的图像中的正方形

通过Selenium从页面获取所有H2元素

从groupby执行计算后创建新的子框架

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

NumPy中条件嵌套for循环的向量化

提取相关行的最快方法—pandas

网格基于1.Y轴与2.x轴显示在matplotlib中

如何找出Pandas 图中的连续空值(NaN)?

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送