У меня есть ресурс в следующем формате:

{"url": "http://res1.icourses.cn/share/process17//mp4/2017/3/17/6332c641-28b5-43a0-894c-972bd804f4e1_SD.mp4", "name": "1-课程导学"}, 
{"url": "http://res2.icourses.cn/share/process17//mp4/2017/3/17/a21902b6-8680-4bdf-8f47-4f99d1354475_SD.mp4", "name": "2-计算机网络的定义与分类"}

Я хочу извлечь имена файлов 6332c641-28b5-43a0-894c-972bd804f4e1_SD.mp4 и a21902b6-8680-4bdf-8f47-4f99d1354475_SD.mp4 из URL.

Как бы я написать регулярное выражение, чтобы соответствовать строке в этом месте?

-4
REA 22 Фев 2018 в 15:37

3 ответа

Лучший ответ

Вы можете использовать re.findall:

import re
s = [{"url": "http://res1.icourses.cn/share/process17//mp4/2017/3/17/6332c641-28b5-43a0-894c-972bd804f4e1_SD.mp4", "name": "1-课程导学"}, {"url": "http://res2.icourses.cn/share/process17//mp4/2017/3/17/a21902b6-8680-4bdf-8f47-4f99d1354475_SD.mp4", "name": "2-计算机网络的定义与分类"}]
filenames = [re.findall('(?<=/)[\w\-\_]+\.mp4', i['url'])[0] for i in s]

Выход:

['6332c641-28b5-43a0-894c-972bd804f4e1_SD.mp4', 'a21902b6-8680-4bdf-8f47-4f99d1354475_SD.mp4']
0
Ajax1234 24 Фев 2018 в 14:19

Основываясь на предоставленных вами строках, вы можете перебирать словари, получать значение для «url» и использовать следующее регулярное выражение

([^\/]*)$

Объяснение :

() - defines capturing group
[^\/] - Match a single character not present after the ^
\/ - matches the character / literally (case sensitive)
* - Quantifier — Matches between zero and unlimited times, as many times as possible, giving back as needed (greedy)
$ - asserts position at the end of the string, or before the line terminator right at the end of the string (if any)

Например:

for record in records:
    print(re.search("([^\/]*)$", record['url']).group(1))

В этом случае мы используем тот факт, что имя файла находится в конце строки. Использование якоря $ делает единственное допустимое совпадение тем, которое завершает строку.

Если вы хотите сделать это для словаря, приведенного как строка, вы можете сделать , изменив условие завершения. Как и так ([^\/]*?)\",. Теперь ", завершает сопоставление (обратите внимание на \, чтобы выйти из ". См. https://regex101.com/r/k9VwC6/25

Наконец, если бы нам не повезло, что группа захвата была в конце строки (то есть мы не могли использовать $), мы могли бы использовать отрицательный взгляд позади. Вы можете прочитать об этих здесь.

0
matisetorm 22 Фев 2018 в 13:18

Вы можете использовать короткое регулярное выражение [^/]*$

Код:

import re
s = [{"url": "http://res1.icourses.cn/share/process17//mp4/2017/3/17/6332c641-28b5-43a0-894c-972bd804f4e1_SD.mp4", "name": "1-课程导学"}, {"url": "http://res2.icourses.cn/share/process17//mp4/2017/3/17/a21902b6-8680-4bdf-8f47-4f99d1354475_SD.mp4", "name": "2-计算机网络的定义与分类"}]
filenames = [re.findall('[^/]*$', i['url'])[0] for i in s]
print(filenames)`

Выход:

['6332c641-28b5-43a0-894c-972bd804f4e1_SD.mp4', 'a21902b6-8680-4bdf-8f47-4f99d1354475_SD.mp4']

Проверьте регулярное выражение - https://regex101.com/r/k9VwC6/30

0
TigerTV.ru 5 Мар 2018 в 14:25