2017-09-20 8 views
3

私がしようとしているのは、プレフィックス(1k = 1000,-1ki = -1024など)。'K'、 'M'、 'G'、 'Mi'、 'Gi'などと一致する方法はありますが、単調な 'i'の添え字は使用しないでください

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

しかし、それは1iと一致するので、私はそれが文字クラス内の文字の一つが先行する場合にのみiに一致する正規表現を見つけようとしています:この正規表現は近くにあります。 (?i)[KMGTPEZY]を繰り返すように持っている洗練...

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

これは1iと一致しませんが、今では1のような接頭辞なしで数とは一致しません、それはそうですので、私:私は後読みを使用してみましたこれを行うより優雅な方法があることを期待していました。それはPythonでも動作します:-)。

それが答えに影響を与える場合には、完全な問題は、私は123[5-10)20-251k-2k、​​、10Tのようなものを扱うようにしたいです...プレフィックス速記のための適切な番号に置き換えて(1k=100010ki=10240など)、実際のシーケンスのリストを生成します(したがって、[5-10)から5,6,7,8,920-25[20-25]または20,21,22,23,24,25に相当します)。しかし、今、私は接頭辞略記と一致する最初のステップにいます。

答えて

0

これは実際には非常に簡単です:

(?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' 
+1

本当にありがとうございました。私の質問に答えるだけでなく、大文字小文字を区別しないフラグのグローバルな性質を認識していませんでした。 –

0

はい、おそらくファンシーな機能でこれに対処できます。 しかし、それは必要ではありません。

簡単な交替で十分です。私たちは 'のKi'、または試合 'K' と一致、または一致したいことを、例えば、言っている

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

は...

関連する問題