使用regex和python从字符串中提取路由

时间:2013-07-04 01:22:48

标签: python regex

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

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

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作为分隔符。但这也无法弄清楚。

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

*?

您可以在此处阅读更多内容:http://docs.python.org/2/library/re.html

发生的事情是.*将尽可能多地消耗输入(在你的情况下直到最后一个管道) .*?代替消耗尽可能少(在您的情况下将停在第一个管道)

另一种更快捷的方式是通过看起来像字段分隔符然后选择正确的行来分割

"|".split(row)[3]

答案 1 :(得分:1)

使用非贪婪的正则表达式

.*? 

而不是贪婪的

.*

答案 2 :(得分:0)

尝试这种模式:

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

正如其他人所说,你原来的模式太贪婪了。因为您需要的是以'.mpc'结尾的文本,并且所有文本块都由管道分隔,您可以获取以'.mpc'结尾的所有不是管道的字符以实现您想要的结果。