首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配“K”、“M”、“G”、“Ki”、“Mi”、“Gi”等,而不是孤立的“I”词缀

如何匹配“K”、“M”、“G”、“Ki”、“Mi”、“Gi”等,而不是孤立的“I”词缀
EN

Stack Overflow用户
提问于 2017-09-20 19:22:46
回答 2查看 200关注 0票数 3

我要做的是将速记符号与国际标准化组织前缀(1k = 1000-1ki = -1024等)匹配。这个正则表达式是接近的:

代码语言:javascript
复制
^([+-]?)(\d+)((?i)[KMGTPEZY]?(?i)i?$)

但是它与1i匹配,所以我试图找到一个正则表达式,它只有在字符类前面有一个字母的情况下才能与i匹配。我试着用一个查找器:

代码语言:javascript
复制
^([+-]?)(\d+)((?i)[KMGTPEZY]?(?<=(?i)[KMGTPEZY])(?i)i?$)

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

如果它影响到答案,完全的问题是我想处理像123[5-10)20-251k-2k2Mi-3Gi10T.用适当的数字替换前缀速记(1k=100010ki=10240等),然后生成一个实际序列的列表(因此将[5-10)扩展到5,6,7,8,920-25相当于[20-25]20,21,22,23,24,25),但现在,我只需要匹配前缀简写符号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-20 20:14:40

实际上,这是非常简单的:

代码语言:javascript
复制
(?i)^([+-])?(\d+)([KMGTPEZY]i?)?$

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

注意,作为一个全局标志,(?i)只需要指定一次(传统上是在正则表达式开始时指定的,在那里很容易发现)。如果要指定后缀的可选部分是区分大小写的,则全局标志不会对您有所帮助,您将不得不这样做:

代码语言:javascript
复制
^([+-])?(\d+)([KkMmGgTtPpEeZzYy]i?)?$

示例:

代码语言:javascript
复制
>>> import re
>>> pattern = re.compile('(?i)^([+-])?(\d+)([KMGTPEZY]i?)?$')

代码语言:javascript
复制
>>> pattern.search('12').groups()
(None, '12', None)

代码语言:javascript
复制
>>> pattern.search('-34').groups()
('-', '34', None)

代码语言:javascript
复制
>>> pattern.search('+56m').groups()
('+', '56', 'm')

代码语言:javascript
复制
>>> pattern.search('-78ki').groups()
('-', '78', 'ki')

代码语言:javascript
复制
>>> pattern.search('90i').groups()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
票数 0
EN

Stack Overflow用户

发布于 2017-09-20 19:47:29

是的,也许可以用漂亮的功能来解决这个问题。但不那没必要。

简单的替换就足够了。

代码语言:javascript
复制
^([+-]?\d+)([KMGTPEZY]i|[KMGTPEZY]|)$

这就是说,例如,我们想要匹配'Ki',或者匹配'K',或者匹配……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46330240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档