2015-01-26 2 views
0

Я пытаюсь использовать смену нескольких имен файлов, используя группы регулярных выражений, но не могу заставить его работать (несмотря на то, что, как пишет regexr.com, должно быть допустимым оператором regex) , В 93000 файлов я в настоящее время есть все выглядит примерно так:Использование Regex для смены имен файлов с помощью Python

Mr. McCONNELL.2012-07-31.2014sep19_at_182325.txt  
Mrs. HAGAN.2012-12-06.2014sep19_at_182321.txt 
Ms. MURRAY.2012-06-18.2014sep19_at_182246.tx 

И я хочу, чтобы выглядеть следующим образом:

20120731McCONNELL2014sep19_at_182325.txt 

Но каждый раз, когда я бегу сценарий ниже, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "changefilenames.py", line 11, in <module> 
    date = m.group(2) 
AttributeError: 'NoneType' object has no attribute 'group' 

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

import os 
import re 
from dateutil.parser import parse 


for filename in os.listdir("."): 
    if filename.startswith("Mr."): 

     m = re.match("Mr.\s(\w*).(\d*-\d*-\d*).(\w*).txt", filename) 
     date = m.group(2) 
     name = m.group(1) 
     timestamp = m.group(3) 

     dt = parse(date) 
     new_filename = "{dt.year}{dt.month}{dt.day}".format(dt=dt) + name + timestamp + ".txt" 

     os.rename(filename, new_filename) 
     print new_filename 

    print "All done with the Mr" 

    if filename.startswith("Mrs."): 

     m = re.match("Ms.\s(\w*).(\d*-\d*-\d*).(\w*).txt", filename) 
     date = m.group(2) 
     name = m.group(1) 
     timestamp = m.group(3) 

     dt = parse(date) 
     new_filename = "{dt.year}{dt.month}{dt.day}".format(dt=dt) + name + timestamp + ".txt" 

     os.rename(filename, new_filename) 
     print new_filename 

    print "All done with the Mrs" 

    if filename.startswith("Ms."): 

     m = re.match("Mrs.\s(\w*).(\d*-\d*-\d*).(\w*).txt", filename) 
     date = m.group(2) 
     name = m.group(1) 
     timestamp = m.group(3) 

     dt = parse(date) 
     new_filename = "{dt.year}{dt.month}{dt.day}".format(dt=dt) + name + timestamp + ".txt" 

     os.rename(filename, new_filename) 
     print new_filename 

    print "All done with the Mrs" 

EDIT Я изменил сценарий на основе предложений ниже, но я все еще получаю те же самые ошибки. Вот новый сценарий:

for filename in os.listdir("."): 

    m = re.search("(Mr|Mrs|Ms)\.\s(\w*)\.(\d*\-\d*\-\d*)\.(\w*)\.txt", filename) 
    date = m.group(2) 
    name = m.group(1) 
    timestamp = m.group(3) 

    dt = parse(date) 
    new_filename = "{dt.year}{dt.month}{dt.day}".format(dt=dt) + name + timestamp + ".txt" 

    os.rename(filename, new_filename) 
    print new_filename 
+0

Ни ваших регулярных выражений соответствует 'миссис HAGAN.2012-12-06.2014sep19_at_182321.txt', поэтому 're.match' возвращает' None'. Обратите внимание, что вы проверяете 'if filename.startswith (« Ms. »)', Но регулярное выражение соответствует 'Mrs.', а не' Ms.'. –

ответ

0

Вы должны использовать re.search вместо re.match, более подробно читайте search() vs. match():

>>> s="Mr. McCONNELL.2012-07-31.2014sep19_at_182325.txt " 
>>> import re 
>>> m = re.search("Mr.\s(\w*).(\d*-\d*-\d*).(\w*).txt", s) 

>>> date = m.group(2) 
>>> date 
'2012-07-31' 
>>> name = m.group(1) 
>>> name 
'McCONNELL' 
>>> timestamp = m.group(3) 
>>> timestamp 
'2014sep19_at_182325' 
+0

Спасибо, но сделали это, и все та же ошибка! –

0

Вот мои предложения на вашем регулярном выражении.

  1. Escape специальные символы (периоды и тире).
  2. Объедините регулярные выражения, сгруппировав префикс.
  3. Группируйте цифры, чтобы их можно было получить позже.

    (Mr|Mrs|Ms)\.\s(\w*)\.(\d*)\-(\d*)\-(\d*)\.(\w*)\.txt

+0

Это дало мне ту же ошибку! –

+0

Хорошо. Попробуйте комбинировать мой ответ с Kasra ниже, используя 're.search' вместо' re.match'. Остерегайтесь того, что номера групп в моем регулярном выражении отличаются друг от друга, но вам не придется передавать части даты через синтаксический анализатор даты. –

+0

Сделал это и не повезло! Я разместил новый скрипт выше. Если в папке есть определенные файлы, которые отличаются друг от друга, просто пропустите их или выплюнете эту ошибку? Потому что я решил, что это просто пропустить их, но я, возможно, ошибаюсь. –

0

re.sub(r'^Mrs?\. (\w+)\.(\d{4})-(\d{2})-(\d{2})\.(\d{4}\w+\d+_at_\d+)(\.txt)$',r'\2\3\4\1\5\6','Mr. McCONNELL.2012-07-31.2014sep19_at_182325.txt')

+2

Пожалуйста, отредактируйте свой ответ и объясните, почему это является хорошим решением проблемы. – Ben

0

Я преобразование, как это (Отказ от ответственности, я не убираются это вверх на всех):

import re 

from pprint import pprint 

names = """ 
Mr. McCONNELL.2012-07-31.2014sep19_at_182325.txt 
Mrs. HAGAN.2012-12-06.2014sep19_at_182321.txt 
Ms. MURRAY.2012-06-18.2014sep19_at_182246.txt 
""".strip() 

for record in names.splitlines(): 
    name, part2 = re.split('\.(?=\d)', record, 1) 
    date, at_time, fileext = re.split('\.', part2) 

    pprint(record) 
    pprint(''.join([ 
     date.replace('-', ''), 
     name.translate(None, ' .',), 
     at_time, 
    ]) + '.' + fileext) 


    print('\n') 
Смежные вопросы