gpt4 book ai didi

python - 如何匹配 'K' , 'M' , 'G' , 'Ki' , 'Mi' , 'Gi' 等但不是单独的 'i' 词缀

转载 作者:行者123 更新时间:2023-11-28 19:06:22 28 4
gpt4 key购买 nike

我想做的是将速记符号与 ISO 前缀(1k = 1000-1ki = -1024 等)相匹配。这个正则表达式很接近:

^([+-]?)(\d+)((?i)[KMGTPEZY]?(?i)i?$)

但它匹配 1i,所以我试图找到一个正则表达式,如果 i 前面是字符类中的一个字母,它只会匹配它。我尝试使用后视:

^([+-]?)(\d+)((?i)[KMGTPEZY]?(?<=(?i)[KMGTPEZY])(?i)i?$)

这不会匹配1i,但现在它不会匹配像1这样没有前缀的数字,而且似乎...不得不重复不雅(?i)[KMGTPEZY] 所以我希望有一种更优雅的方式来做到这一点......也适用于 Python :-)。

万一它影响了答案,完整的问题是我想处理像 1,2,3, 这样的事情[5-10),20-25,1k-2k,2Mi-3Gi,10T >...用适当的数字替换前缀简写(1k=100010ki=10240 等),然后生成实际序列的列表(因此展开 [5-10)5,6,7,8,920-25等同于[20-25] 20,21,22,23,24,25),但现在,我正处于第一步,这只是匹配前缀速记符号。

最佳答案

这其实很简单:

(?i)^([+-])?(\d+)([KMGTPEZY]i?)?$

这里我们指定了一个可选的组 ([KMGTPEZY]i?)? 它本身包含可选的匹配项 i?

请注意,作为全局标志,(?i) 只需指定一次(传统上指定在正则表达式的开头,很容易被发现)。如果你想指定后缀的可选 i 部分 区分大小写,全局标志对你没有帮助,你必须这样做:

^([+-])?(\d+)([KkMmGgTtPpEeZzYy]i?)?$

例子:

>>> import re
>>> pattern = re.compile('(?i)^([+-])?(\d+)([KMGTPEZY]i?)?$')

>>> pattern.search('12').groups()
(None, '12', None)

>>> pattern.search('-34').groups()
('-', '34', None)

>>> pattern.search('+56m').groups()
('+', '56', 'm')

>>> pattern.search('-78ki').groups()
('-', '78', 'ki')

>>> pattern.search('90i').groups()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'

关于python - 如何匹配 'K' , 'M' , 'G' , 'Ki' , 'Mi' , 'Gi' 等但不是单独的 'i' 词缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46330240/

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