2017-01-22 3 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 строки. Это также может быть похоже на то, что «x:» сам по себе может не присутствовать, что делать в подобных случаях. число может отсутствовать.

выхода Я смотрю на это

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

Ваш вход на один как вы показали? Или это новая линия? – idjaw

+0

это единственная строка. – user168983

+0

Есть ли номер в имени 'name1',' name2', поскольку он не соответствует вашему регулярному выражению. '[^ 0-9] +'? – Psidom

ответ

1

Вы можете использовать следующее регулярное выражение:

(\d+)\s([^\s]+)\s(?:x:([^\s]+))?\s(?:y:([^\s]+))?\s(?:z:([^\s]+))? 
  • согласующей группу для x:, y: и z: не являются обязательными (с ?) , Это означает, что значение группы просто не определено, если оно не может совпадать, но все выражение все еще совпадает.
  • Несоответствующие группы (?:) используются для нумерации групп ($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) 

Вам не нужно использовать регулярное выражение.

1

Чтобы получить все матчи, вы можете использовать следующее регулярное выражение:

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

Так, в Python:

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

Не совсем, цитата: 'Может также быть как-то" x: 'сама может не присутствовать, что делать в таких случаях. Если 'x:' не существует, это не сработает. –

Смежные вопросы