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

标签 python regex regex-lookarounds

我想做的是将速记符号与 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/

相关文章:

java - 使用单引号作为分割点将字符串分割为子字符串,但不要在引号前面加上反斜杠 (\) 并后跟另一个引号

python - kubeflow ParallelFor使用之前的containerop输出

python - 在 python/pygame 中创建多个实例时遇到问题

c# - 将正则表达式语法扩展为 'does not contain text XYZ'

javascript - 将正则表达式翻译为 PHP

javascript - JavaScript 中的环视替代方案

python - 在 python 中有效计算三阶张量

python - 从协程接收器写入 csv 文件...如何避免关闭文件错误?

javascript - 从 HTML 文件输出两个特定字段的值的最简单方法是什么?

ruby - 如果单词没有出现在其他单词之前,则正则表达式匹配