我有一个类似的字符串。
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>
答案 0 :(得分: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);
}
&#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)