2016-08-26 12 views
0

こんにちは、それぞれの式をコロンから区切ります。だから、 'ss_vv'、 'kk'、 'pp'を取得したい。しかし、以下の2つの印刷表現は私に 'v'と 'k'を与え、各文字列の部分だけを取得します。誰がここで何が間違って見ることができますかPythonの正規表現とグループ関数

m0 = re.compile(r'([a-z]|_)+:([a-z]|_)+:([a-z]|_)+') 
m1 = m0.search('ss_vv:kk:pp') 
print m1.group(1) 
print m1.group(2) 
+0

':'の単純な分割? – Jan

答えて

4
In [52]: m0 = re.compile(r'([a-z|_]+):([a-z|_]+):([a-z|_]+)') 

In [53]: m1 = m0.search('ss_vv:kk:pp') 

In [54]: print m1.group(1) 
ss_vv 

In [55]: print m1.group(2) 
kk 

In [56]: print m1.group(3) 
pp 

私の正規表現は何:

([a-z|_]+):([a-z|_]+):([a-z|_]+) 

Regular expression visualization

Debuggex Demo

あなたの正規表現は何:

([a-z]|_)+:([a-z]|_)+:([a-z]|_)+ 

Regular expression visualization

Debuggex Demo

+0

良い説明+1 – tharif

1

あなたのケースのための正規表現を使用する必要はありません。 ':'に基づいて分割し、必要な出力を得ることができます。

>>> a = 'ss_vv:kk:pp' 
>>> b_list = a.split(':') 
>>> b_list 
['ss_vv', 'kk', 'pp'] 
>>> 
2

正規表現の他のルールは何ですか?あなたの質問をもとに、この正規表現はどうなる:

m0 = re.compile(r'(.*):(.*):(.*)') 
m1 = m0.search('ss_vv:kk:pp') 
print m1.group(1) 
print m1.group(2) 

UPDATE:正規表現の効率的でより有効に活用するために、コメントで@Janで述べたように 、あなたは

regex = r'([^:]+):([^:]+):([^:]+)' 
m0 = re.compile(regex) 
としてそれを変更することができます

出力:

ss_vv 
kk 

か、単に文字列を分割することにより:

string = 'ss_vv:kk:pp' 
parts = string.split(':') 

print parts 

outputs: ['ss_vv', 'kk', 'pp'] 
+1

私が間違っていないと、私は '[^:] *'はうまくいかないと信じていますか? – maws

+1

もちろん、istは所有していません。私が言ったことは、['[^:] *:[^:] *:[^:\ n] *'](https://regex101.com/r/dT2oT8/1)と['( 。*):(。*):(。*) '](https://regex101.com/r/dT2oT8/2) - **重要な**削減の段階がありますか?前者は36、後者は284(9回!)が必要です。私のポイントは:ドットスター( '。*')は、あなたのラインを引っ張ってきて、バックトラックする* - 時には非常に効果がないことがあります。一般的な経験則として、より具体的にしようとし、正規表現でより早く終了しようとします。それにもかかわらず、ここで分割オプションの+1: – Jan

+0

ああ...はい、私はあなたのポイントを参照してください..それは非常に有益な.. :)ありがとう! – maws