我要做的是将速记符号与国际标准化组织前缀(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),但现在,我只需要匹配前缀简写符号。
发布于 2017-09-20 20:14:40
实际上,这是非常简单的:
(?i)^([+-])?(\d+)([KMGTPEZY]i?)?$在这里,我们指定一个可选组([KMGTPEZY]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'发布于 2017-09-20 19:47:29
是的,也许可以用漂亮的功能来解决这个问题。但不那没必要。
简单的替换就足够了。
^([+-]?\d+)([KMGTPEZY]i|[KMGTPEZY]|)$这就是说,例如,我们想要匹配'Ki',或者匹配'K',或者匹配……
https://stackoverflow.com/questions/46330240
复制相似问题