多次解析相同匹配的字符串

时间:2017-01-22 13:17:14

标签: python regex

我有一个类似的字符串。

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行中反复迭代它们。它也可能像某些人一样&#39; x:&#39;本身可能不会出现在这样的情况下该做什么。这个数字可能不存在。

我正在看的输出是

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

3 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

(\d+)\s([^\s]+)\s(?:x:([^\s]+))?\s(?:y:([^\s]+))?\s(?:z:([^\s]+))?
  • x:y:z:的匹配组是可选的(?)。这意味着,组的值只是未定义,如果它不匹配,但整个表达式仍然匹配。
  • 非匹配组(?:)用于保持组的编号($1$2等)清晰。
  • 空间(即每种形式的空白)用于保持群体分开。如果<something>包含空格字符,则它将无法再正常工作。

以下是JavaScript中的可执行示例:

&#13;
&#13;
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);
}
&#13;
&#13;
&#13;

答案 1 :(得分: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)

您不需要使用正则表达式。

答案 2 :(得分:1)

要获得所有匹配项,您可以使用以下正则表达式:

$this->TheModules->title

所以,在Python中:

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

给出输出:

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)