LINUX.ORG.RU

bash expr VS python re.

 


0

1

Был у меня скрипт на питоне, который в числе прочего искал инфу о фильме на IMDB/Кинопоиск.И я его случайно грохнул.)Теперь пытаюсь восстановить - ничего не получается!(но как же я его раньше написал?!)

Суть задачи - преобразовать название файла из например такого

Nightmare.Detective.2006.TV1000.Rus.Jap.avi
во вменяемый для поиска вид.

В качестве образца использовал когда-то это

#!/bin/bash
MOVIE_SEPCHAR='+'

MOVIE=$1

MOVIE=${MOVIE##*/} # remove path (/home/user/../)
MOVIE=${MOVIE%.*} # remove type (.avi, .mkv)

MOVIE=${MOVIE// /.} # replace space (" ") to dot (".")

MOVIE=`echo $MOVIE | tr '[:upper:]' '[:lower:]'` # to lowercase
MOVIE=`echo $MOVIE | tr '\.\-\_' $MOVIE_SEPCHAR` # replace .-_ to separate character
MOVIE=`expr "$MOVIE" : '\([^\[\(]*\)'` # remove brackets
if [ "`expr "$MOVIE" : '\(.*\)[0-9][0-9][0-9][0-9]'`" != "" ]; then
  MOVIE=`expr "$MOVIE" : '\(.*\)[0-9][0-9][0-9][0-9]'` # remove year
fi

echo "$MOVIE"
Пока дошел до
#!/usr/bin/python
# coding: utf-8
from os import path
from sys import argv
from re import search

video = argv[1]
name = path.splitext(path.basename(video))[0]

for regex in ('\(.*', '\[.*', '[0-9][0-9][0-9][0-9]'):
	match = search(regex, name)
	if match:
		name = name.replace(match.group(),'')

for rep in ('.', '_', ' '):
	name = name.rstrip(rep)
	name = name.replace(rep, '+')

print name
- но ето совсем не аналогично, в чём легко можно убедиться при названии например 1492_zavoevaniye_raya_[tfile.ru].mkv или терминатор-2000.1987.аvi.

Вобщем помогите восстановить скрипт и обьясните в чем отличия в регулярках в re и expr (потому что тупо взятые из примера с expr в re не работают)

★★

Nightmare.Detective.2006.TV1000.Rus.Jap.avi'.split('.')

['Nightmare', 'Detective', '2006', 'TV1000', 'Rus', 'Jap', 'avi']

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

RA ()
Ответ на: комментарий от RA

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

При переводе велосипеда на баше, на велосипед на питоне эта задача решается автоматически. В том то и замысел ТСа

zolden ★★★★★ ()

'\(.*' — лишнее экранирование скобок.

baverman ★★★ ()
Ответ на: комментарий от baverman

У меня error без экранирования.

Ну там несколько не так надо, могут и в начале названия быть ненужности в скобках. Потому

for regex in ('\(.*\)', '\[.*\]'):
	match = search(regex, name)
	if match:
		name = name.replace(match.group(),'')
А вот с цифрами так и ниасилил, юзаю пока expr через Popen (

Нюанс видимо в

If the match succeeds and REGEX uses `\(' and `\)', the `:'

и т.д. ( http://ss64.com/bash/expr.html ) ,а в питоне не так

nitz ★★ ()
print '+'.join(re.findall(r'[^._]+(?=[_.])', video)
Yur4eg ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.