Сопоставление строки между n-м вхождением символа в python с регулярным выражением

#regex #python-3.x

#регулярное выражение #python-3.x

Вопрос:

Я работаю с файлами в tar.gz файл, содержащий текстовые файлы, и попытка извлечь имя файла связанного TarInfo объекта, свойство member.name которого выглядит следующим образом:

 aclImdb/test/neg/1026_2.txt
aclImdb/test/neg/1027_5.txt
...
aclImdb/test/neg/1030_4.txt
  

Я написал следующий код, который выводит строку test/neg/1268_2

 regex = '/((?:[^/]*/).*?).'
with tarfile.open("C:\Users\Orestis\Desktop\aclImdb_v1.tar.gz") as archive:
    for member in archive.getmembers():
         if member.isreg():
         m = re.findall(regex, member.name)
         print(m)
  

Как я должен изменить регулярное выражение, чтобы извлечь только 1268_2 часть имен файлов? Фактически я хочу извлечь строку после 3-го вхождения "/" и до 1-го вхождения "." .

Комментарии:

1. d _d (?=.w $) или w (?=.w $) подойдет.

2. Вероятно, вы могли бы даже сделать это без регулярного выражения, выполнив что-то вроде str_list = in.split('/')[3] and then out = ''.join(str_list) (это захватит ВСЕ после третьего «/»).

Ответ №1:

Вы могли бы жестко запрограммировать это:

 .*?/.*?/.*?/(.*?).
  

Более элегантным является что-то вроде этого:

 (.*?/){3}(.*?).
  

Вы можете просто изменить 3 в соответствии с вашим шаблоном. (Обратите внимание, что нужная вам группа равна 2 долларам)