2017-01-22 21 views
1

私はストリングが好きです。同じマッチの文字列を複数回解析する

1000 name1 x:<something1> y:<something2> z:<somthing3> 24 name2 x:<something4> y:<something5> z:<something6> 

x、y、zの後ろの名前、名前、開始位置の番号を取得します。

[0-9]+ *[^0-9]+ x:(.*) y:(.*) z:(.*)でしたが、正しい結果が得られませんでした。

番号、名前、値を取得して、n行分繰り返し繰り返します。それはまたsomethimes 'x:'のように、それ自体がそのような場合に何をするべきではないかもしれない。その数は存在しないかもしれない。私が探しています

出力は、あなたが次の正規表現を使用することができます

1000 name1 <something1> <something2> <something3> 
24 name2 <something4> <something5> <something6> 
+0

は、単一の上ご入力され、あなたが示したようにライン?それとも実際に新しい行を区切っていますか? – idjaw

+0

これは1行です。 – user168983

+0

'name1'、' name2'という名前の中に、あなたの正規表現と一致しないような数字がありますか? '[^ 0-9] +'? – Psidom

答えて

1

です:x:y:z:ため

(\d+)\s([^\s]+)\s(?:x:([^\s]+))?\s(?:y:([^\s]+))?\s(?:z:([^\s]+))? 
  • マッチンググループを(?で)はオプションです。これは、グループの値が一致しない場合でもグループの値は未定義ですが、式全体が一致することを意味します。
  • 不一致のグループ(?:)は、グループの番号付け($1,$2など)をきれいにするために使用されます。
  • スペース(つまり、すべてのフォームの空白)を使用してグループを分けていました。 <something>に空白文字が含まれていると、正しく機能しなくなります。ここで

は、JavaScriptで実行可能な例である:

var text = '1000 name1 x:<something1> y:<something2> z:<somthing3> 24 name2 y:<something5> z:<something6>'; 
 
var regex = /(\d+)\s([^\s]+)\s(?:x:([^\s]+))?\s(?:y:([^\s]+))?\s(?:z:([^\s]+))?/g; 
 
var match = regex.exec(text); 
 

 
while(match !== null) { 
 
    console.log(match[1], match[2], match[3], match[4], match[5]); 
 
    match = regex.exec(text); 
 
}

1
line = "1000 name1 x:<something1> y:<something2> z:<somthing3> 24 name2 x:<something4> y:<something5> z:<something6>" 

p1 = line.find (" ") 
p2 = line[p1+1:].find (" ") 
print (line[:p1]) 
print (line[p1+1:p1+p2]) 
values = [x.split(":") for x in line [p1+p2+2:].split(" ")] 
print (values) 

あなたは正規表現を使用する必要はありません。 Pythonで、だから、

([0-9]+)? (\S+)(?: x:(\S+))?(?: y:(\S+))?(?: z:(\S+))? 

1

すべての一致を取得するには、以下の正規表現を使用することができます

text = r'1000 name1 x:<something1> y:<something2> z:<somthing3> 24 name2 x:<something4> y:<something5> z:<something6>' 
output = re.findall(r'([0-9]+) (\S+)(?: x:(\S+))?(?: y:(\S+))?(?: z:(\S+))?', text) 

は出力が得られます。

[(1000, 'name1', '<something1>', '<something2>', '<somthing3>'), 
(24, 'name2', '<something4>', '<something5>', '<something6>')] 
+0

' 'のいずれかがそこにない場合、これは動作しません。彼らは質問者に応じてオプションである必要があります。そしてそれは私の以前の答えにかなり似ています。 –

+0

文字列以外の部分を0以上にすることで修正されました。 –

+0

実際には引用符で囲まれていません。 'それはsomethimes' x: 'のような場合もあります。 'x:'がなければ、動作しません。 –