如何获取子字符串最后出现之前的字符串?

5

我想要获取给定子字符串最后出现之前的字符串。

我的字符串是,

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

我的子字符串为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. 正则表达式匹配直到最后一个出现的 /
  2. 正则表达式最后一次出现?

我通过使用带切片的正则表达式得到了答案,但我想仅使用正则表达式实现。

3个回答

8

为什么要使用正则表达式呢?直接使用内置的字符串方法即可:

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])

看起来不错.. 没有正则表达式的好例子.. 但问题是我不知道子字符串.. 子字符串将带有填充的一些数字.. - Mohideen bin Mohammed
2
是的,这种方法仅适用于静态模式,但如果关键字未知且需要进行模式搜索,则必须使用正则表达式。 - anubhava

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

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

(.*)1001-1010

您的匹配结果在捕获组#1中。

由于.*的贪婪性质,它将在匹配您的关键字1001-1010之前匹配最长匹配

正则表达式演示


如下评论所述,如果关键字不是静态字符串,则可以使用此正则表达式:

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

Python 代码:

>>> 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']

1
太好了,我稍微修改了你的答案.. (.*)\d*-\d* 数字也不是静态的,所以我把它做成了这样.. 填充会有所不同.. 谢谢,我尝试过用.(\d-\d*)/代替。这就是为什么我没有找到的原因。 - Mohideen bin Mohammed
是的,您也可以使用:r'(.*\D)\d+-\d+' - anubhava
1
谢谢@anubhava (.*\D)\d+-\d+ 这就是我想要的...之前的代码给了我子字符串和字符串,但这个代码两者都有。 - Mohideen bin Mohammed
1
好的,答案已相应更新。请在您的问题中提及此事,以便读者更好地理解为什么需要正则表达式方法,而使用rfind进行字符串搜索不起作用。 - anubhava
1
accepted +1 rfind 可以对静态的内容有用,但我的内容是动态的。这就是我找到解决办法的原因。 - Mohideen bin Mohammed

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',)
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接