【问题标题】:How to get String Before Last occurrence of substring?如何在最后一次出现子字符串之前获取字符串?
【发布时间】:2019-04-25 14:39:47
【问题描述】:

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

我的字符串是,

路径 = 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?

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

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    为什么使用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])
    

    【讨论】:

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

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

    (.*)1001-1010
    

    你的比赛在 #1 捕获组

    由于.* 天生贪婪,它会先匹配最长匹配,然后再匹配您的关键字1001-1010

    RegEx Demo


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

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

    【讨论】:

    • 太好了,我稍微修改了你的答案..(.*)\d*-\d* 数字也不是静态的,所以我这样做了.. 填充会有所不同.. 谢谢我试过 .*(\d*-\d *)\/ 反而。这就是为什么我没有找到
    • 是的,您也可以使用:r'(.*\D)\d+-\d+'
    • 感谢@anubhava (.*\D)\d+-\d+ 这就是我想要的.. 前一个给了我字符串和子字符串,但这两者都有。
    • ok 答案已相应更新。请在您的问题中也提及这一点,以便读者更好地理解为什么需要正则表达式方法并且使用 rfind 进行字符串搜索将不起作用。
    • accepted +1 rfind 对静态有用,但我的是动态的。这就是我找到的解决方案
    【解决方案3】:

    感谢@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',)
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多