我想在最后一次出现给定的子字符串之前获取字符串。
我的字符串是,
路径 = 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'
>>>
纯粹使用正则表达式是他们更好的方法吗?
请注意,我已经尝试了很多,例如:
- 正则表达式匹配所有内容,直到最后一次出现/
- 正则表达式最后一次出现?
我通过使用带有切片的正则表达式得到了答案,但我想通过单独使用正则表达式来实现。
为什么要使用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])
您可以使用简单的贪婪匹配和捕获组:
(.*)1001-1010
您的匹配项位于捕获组 #1 中
由于.*
天生贪婪,因此在匹配您的关键字1001-1010
之前,它将匹配最长的匹配。
正则表达式演示
根据下面的评论,如果关键字不是静态字符串,那么您可以使用此正则表达式:
r'(.*D)d+-d+'
蟒蛇代码:
>>> 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'
>>> print (re.findall(r'(.*D)d+-d+', 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_v']
谢谢@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',)
>>>