Код Python3, который переформатирует имена файлов - PullRequest
0 голосов
/ 09 мая 2018
# Regex pattern
filePattern = re.compile(r'''
    (#LPy3THW_Ex)
    (\d){1,3}
    (_macOS|_Windows)?
    (\.mp4)
    ''', re.VERBOSE)

Я пишу программу, которая должна упростить "LPy3THW_Ex6.mp4" до "ex6.mp4". Когда я запускаю его, ниже сообщение об ошибке. Я не уверен, в чем проблема и как ее исправить.

Traceback (most recent call last):
  File "file_rename.py", line 13, in <module>
    ''', re.VERBOSE)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py", line 233, in compile
    return _compile(pattern, flags)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py", line 301, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_compile.py", line 562, in compile
    p = sre_parse.parse(p, flags)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py", line 855, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py", line 768, in _parse
    source.tell() - start)
sre_constants.error: missing ), unterminated subpattern at position 2 (line 2, column 2)

1 Ответ

0 голосов
/ 09 мая 2018

Текущая ошибка связана с символом #, который запускает встроенный комментарий внутри шаблона регулярного выражения, который компилируется с параметром re.VERBOSE.

Вы должны экранировать его (если # должен присутствовать в строке как буквенный хэш-символ) или удалить его (если символ не ожидается внутри строки в этом контексте). Также в соотв. к примеру ввода / вывода вы должны удалить # и перегруппировать группы захвата, возможно, что-то вроде:

filePattern = re.compile(r'''^
    LPy3THW_
    (
      Ex\d{1,3}
      (?:_macOS|_Windows)?
      \.mp4
    )
    $''', re.VERBOSE)
print(filePattern.sub(r"\1", s).lower())
# => ex6.mp4

Обратите внимание, что (\d){1,3} создает повторную группу захвата и сохраняет только последнюю цифру в группе. Я добавил якоря для соответствия всей строке, просто для демонстрационной цели (так как я использую re.sub здесь).

Однако, похоже, вы можете просто разделить с помощью _ на 2 части и получить последний элемент:

s.split('_', 2)[-1].lower() # => ex6.mp4

См. Демоверсию Python

...