Функция замены регулярного выражения содержит слишком много текста

#python #regex

#python #регулярное выражение

Вопрос:

Я новичок в python. Мой скрипт (ниже) содержит функцию с именем «fn_regex_raw_date_string», которая предназначена для преобразования «необработанной» строки даты, подобной этой: Пн, 31 октября 2011 г. в 8:15 вечера, в строку даты, подобную этой: _2011-Oct-31_PM_8-15_

Вопрос № 1: Когда «необработанная» строка даты содержит посторонние символы, например (xxxxxMon, 31 октября 2011 г. в 8:15 вечера), как мне изменить мою процедуру регулярного выражения, чтобы исключить посторонние символы?

   I was tempted to remove my comments from the script below to make it 
     simpler to read, but I thought it might be more helpful for me to leave 
     them in the script.
  

Вопрос № 2: Я подозреваю, что мне следует закодировать другую функцию, которая
заменит «Oct» в «2011-Oct-31_PM_8-15_ » на «11». Но я не могу не
задаться вопросом, есть ли какой-то способ включить эту функциональность в
мою функцию fn_regex_raw_date_string .

Любая помощь будет высоко оценена.

Спасибо, Marceepoo

 import sys
import re, pdb
#pdb.set_trace()

def fn_get_datestring_sysarg():
    this_scriptz_FULLName = sys.argv[0]
    try:
        date_string_raw = sys.argv[1]
    #except Exception, e:
    except Exception:
        date_string_raw_error = this_scriptz_FULLName   ':  sys.argv[1] error:  No command line argument supplied'
        print date_string_raw_error
    #returnval = this_scriptz_FULLName   'n'   date_string_raw
    returnval = date_string_raw
    return returnval

def fn_regex_raw_date_string(date_string_raw):
    # Do re replacements
    # p:DataVBPython_MarcsPrgsPython_ItWorksFixCodeFromLegislaturezCalifCode_MikezCode.py
    # see also (fnmatch) p:DataVBPython_MarcsPrgsPython_ItWorksbookmarkPDFs.aab.py

    #srchstring = r"(.? )(Sun|Mon|Tue|Wed|Thu|Fri|Sat)(, )(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)( )([d]{1,2})(, )([d]{4})( at )([d]{1,2})(:)([d]{1,2})( )(A|P)(M)(.? )"
    srchstring = r"(Sun|Mon|Tue|Wed|Thu|Fri|Sat)(, )(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)( )([d]{1,2})(, )([d]{4})( at )([d]{1,2})(:)([d]{1,2})( )(A|P)(M)"

    srchstring = re.compile(srchstring)    
    replacement = r"_7-3-5_13M_9-11_"
    #replacement = r"_8-4-6_14M_10-12_"    
    regex_raw_date_string = srchstring.sub(replacement, date_string_raw)

    return regex_raw_date_string

    # Mon, Oct 31, 2011 at 8:15 PM  
if __name__ == '__main__':
    try:
        this_scriptz_FULLName = sys.argv[0]
        date_string_raw = fn_get_datestring_sysarg()
        date_string_mbh = fn_regex_raw_date_string(date_string_raw)
        print date_string_mbh
    except:
        print 'error occurred - fn_get_datestring_sysarg()'
  

Ответ №1:

Вероятно, вы хотите использовать стандартные данные python datetime:

http://docs.python.org/library/time.html#time.strptime

http://mail.python.org/pipermail/tutor/2006-March/045729.html

Ответ №2:

В этом коде используется регулярное выражение, которое заменяет все в начале строки перед сопоставлением сокращенного дня недели, а затем все до конца строки после сопоставления AM или PM.

Затем он вызывает datetime.strptime(date_str, date_format) , который выполняет тяжелую работу по синтаксическому анализу и дает нам datetime экземпляр:

 from datetime import datetime

import calendar
import re

# -------------------------------------

# _months = "|".join(calendar.month_abbr[1:])
_weekdays = "|".join(calendar.day_abbr)

_clean_regex = re.compile(r"""
    ^
    .*?
    (?="""   _weekdays   """)
    |
    (?<=AM|PM)
    .*?
    $
""", re.X)

# -------------------------------------

def parseRawDateString(raw_date_str):
    try:
        date_str = _clean_regex.sub("", raw_date_str)
        return datetime.strptime(date_str, "%a, %b %d, %Y at %I:%M %p")

    except ValueError as ex:
        print("Error parsing date from '{}'!".format(raw_date_str))
        raise ex

# -------------------------------------

if __name__ == "__main__":
    from sys import argv

    s = argv[1] if len(argv) > 1 else "xxxxxMon, Oct 31, 2011 at 8:15 PMyyyyyy"

    print("Raw date:       '{}'".format(s))
    d = parseRawDateString(s)
    print("datetime object:")
    print(d)
    print("Formatted date: '{}'".format(d.strftime("%A, %d %B %Y @ %I:%M %p")))