3

我似乎无法在这里找到问题所在。

我正在尝试从以下字符串中提取路线。

s = '{2010501005|XXGpvertex|18|0|35|0|{|{30100001|XXparameter_set|@@@@{{30001002|XXparameter|!prototype_path|$AB_COMPONENTS/Partitioning/Concatenate.mpc|3|2|Pf$|@{0|}}'

我在这里想要实现的是获取路线$AB_COMPONENTS/Partitioning/Concatenate.mpc但到目前为止我已经做到了:

re.search('prototype_path\|(.*)\|', s, re.IGNORECASE).group(1)

这给了我输出:

$AB_COMPONENTS/Partitioning/Concatenate.mpc|3|2|Pf$|@{0

我似乎不知道为什么它一直持续到最后一个管道,有人知道发生了什么吗?

重要的是要知道我不能使用管道后面的数字 3。同样重要的是,我可以使用扩展名 .mp 作为分隔符。但这也无法弄清楚。

提前致谢。

4

3 回答 3

2

因为正则.*表达式是贪婪的

.*?

你可以在这里阅读更多:http: //docs.python.org/2/library/re.html

会发生什么.*会消耗尽可能多的输入(在您的情况下一直到最后一个管道) .*?,而不是尽可能少地消耗(在您的情况下将在第一个管道处停止)

另一种更快的方法是按显然看起来像字段分隔符的方式进行拆分,然后选择正确的行

"|".split(row)[3]
于 2013-07-04T01:28:36.127 回答
1

使用非贪婪的正则表达式,

.*? 

而不是贪婪的

.*
于 2013-07-04T01:28:02.460 回答
0

试试这个模式:

re.findall('\|([^|]+?\.mpc)\|', text, re.I)

正如其他人所建议的那样,您原来的模式太贪婪了。由于您只需要以“.mpc”结尾的文本,并且所有文本块都由管道分隔,因此您可以抓取所有以“.mpc”结尾但不是管道的字符来达到您想要的结果。

于 2013-07-04T01:28:25.127 回答