如何在最后一次出现子字符串之前获取字符串?

时间:2019-04-25 14:39:47

标签: python regex python-3.x

我想在给定的子字符串最后一次出现之前获取String。

我的字串是

  

路径=   D:/me/vol101/Prod/cent/2019_04_23_01/image/AVEN_000_3400_img_pic_p1001-1010/pxy/AVEN_000_3400_img-mp4_to_MOV_v1001-1010.mov

我的子字符串1001-1010,它将出现两次。我想要的只是在最后一次出现之前获取字符串。

注意:我的子字符串是动态的,具有不同的填充,但只有数字。

我想要

  

D:/ me / vol101 / Prod / cent / 2019_04_23_01 / image / AVEN_000_3400_img_pic_p1001-1010 / pxy / AVEN_000_3400_img-mp4_to_MOV_v

我已经完成了使用正则表达式和切片的操作,

>>> p = 'D:/me/vol101/Prod/cent/2019_04_23_01/image/AVEN_000_3400_img_pic_p1001-1010/pxy/AVEN_000_3400_img-mp4_to_MOV_v1001-1010.mov'
>>> q = re.findall("\d*-\d*",p)
>>> q[-1].join(p.split(q[-1])[:-1])
'D:/me/vol101/Prod/cent/2019_04_23_01/image/AVEN_000_3400_img_pic_p1001-1010/pxy/AVEN_000_3400_img-mp4_to_MOV_v'
>>> 

仅使用正则表达式,还有其他更好的方法吗?

请注意,我已经尝试了很多,例如:

  1. regular expression to match everything until the last occurrence of /
  2. Regex Last occurrence?

我通过切片使用正则表达式得到了答案,但是我想单独使用正则表达式来实现。

3 个答案:

答案 0 :(得分:3)

为什么使用regex。只需使用内置的字符串方法:

path = "D:/me/vol101/Prod/cent/2019_04_23_01/image/AVEN_000_3400_img_pic_p1001-1010/pxy/AVEN_000_3400_img-mp4_to_MOV_v1001-1010.mov"
index = path.rfind("1001-1010")
print(path[:index])

答案 1 :(得分:3)

您可以使用简单的贪婪匹配和捕获组:

whileTargetTracked

您的比赛在捕获组#1

由于(.*)1001-1010 本质上是贪婪的,因此在匹配关键字.*之前,它将匹配最长匹配

RegEx Demo


根据下面的注释,如果关键字不是静态字符串,则可以使用此正则表达式:

1001-1010

Python代码:

r'(.*\D)\d+-\d+'

答案 2 :(得分:0)

感谢@anubhava,

我的第一个正则表达式是

.*(\d*-\d*)\/

现在我已经纠正了我的问题。

.*(\d*-\d*)

(.*)(\d*-\d*)

这给了我

>>> q = re.search('.+(\d*-\d*)', p)
>>> q.group()
'D:/me/vol101/Prod/cent/2019_04_23_01/image/AVEN_000_3400_img_pic_p1001-1010/pxy/AVEN_000_3400_img-mp4_to_MOV_v0001-1001'
>>> 

(.*\D)\d+-\d+

这正是我想要的...

>>> q = re.search('(.*\D)\d+-\d+', p)
>>> q.groups()
('D:/me/vol101/Prod/cent/2019_04_23_01/image/AVEN_000_3400_img_pic_p1001-1010/pxy/AVEN_000_3400_img-mp4_to_MOV_v',)
>>>