Using Regex to Change Filenames with Python
Question: I'm trying to use change a bunch of filenames using regex groups but can't
seem to get it to work (despite writing what regexr.com tells me should be a
valid regex statement). The 93,000 files I currently have all look something
like this:

    
    
    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
    

And I want them to look like this:

    
    
    20120731McCONNELL2014sep19_at_182325.txt
    

But every time I run the script below, I get the following error:

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

Thanks so much for your help. My apologies if this is a silly question. I'm
just starting with RegEx and Python and can't seem to figure this one out.

    
    
    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 I changed the script based on the suggestions below but am still getting
the exact same errors. Here's the new script:

    
    
    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
    


Answer: You must use `re.search` instead `re.match` , for more detail read [`search()
vs. match()`](https://docs.python.org/2/library/re.html#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'
    

