我想做的是将速记符号与 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=1000
、10ki=10240
等),然后生成实际序列的列表(因此展开 [5-10)
为5,6,7,8,9
,20-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/