Как получить строку до последнего появления подстроки? - PullRequest
2 голосов
/ 25 апреля 2019

Я хочу получить строку до последнего вхождения моей заданной подстроки.

Моя строка была,

путь = 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

Я сделал с помощью регулярных выражений и нарезки, 1023 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 * 10 **

Есть ли лучший способ сделать это с помощью регулярных выражений?

Обратите внимание, что я пробовал так много, например:

  1. обычныйвыражение, чтобы соответствовать всему до последнего вхождения /
  2. Regex Последнее вхождение?

Я получил ответ с помощью регулярных выражений с нарезкой, но я хочудобиться с помощью одного регулярного выражения ..

Ответы [ 3 ]

3 голосов
/ 25 апреля 2019

Вы можете использовать простое жадное совпадение и группу захвата:

(.*)1001-1010

Ваш матч находится в группе захвата # 1

Поскольку .* по своей природе жадный, он будет совпадать самое длинное соответствие перед соответствием вашему ключевому слову 1001-1010.

Демонстрация RegEx


Согласно комментариям ниже, если ключевое слово не является статической строкойтогда вы можете использовать это регулярное выражение:

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']
3 голосов
/ 25 апреля 2019

Зачем использовать 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])
0 голосов
/ 25 апреля 2019

Спасибо @ 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',)
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...