如何实现:正则对一段文本匹配并用自定义函数替换匹配内容

diyinyu0476 2017-09-22 07:12:07
Python
我的需求是将一个文件中所有的日期(格式为:七月 08, 2017 9:30:10 上午)换成标准格式日期。
其中parse函数已经写好(接收此类日期字符串,并返回datetime类型)
但是我试图匹配并替换的时候发现问题了:python中re.sub()的替换内容是固定的字符串,没办法用自己的函数来替换
replace()函数同样无法将匹配到的字符串作为函数的参数。
请教各位大神们,谢谢!

转换函数

def parse_cn_date(date_str):
"""
源文件 catalina.2017-06-06.log
日期格式 七月 08, 2017 9:30:10 上午
:param date_str: <unicode> raw date
:return: <datetime>
"""
if not isinstance(date_str, unicode):
raise AttributeError

month_regex = u'([\u4e00]|[\u4e8c]|[\u4e09]|[\u56db]|[\u4e94]|[\u516d]' \
u'|[\u4e03]|[\u516b]|[\u4e5d]|[\u5341]){1,2}[\u6708]'
year = int(re.search(u'\d{4} ', date_str).group().strip())
day = int(re.search(u'\d{2},', date_str).group()[:-1])
month = int(month_dict[re.search(month_regex, date_str).group()])
is_pm = re.search(u'[\u4e00-\u9fa5][\u5348]', date_str).group()[0] == u'下'
time = re.search(u'\d{1,2}:\d{1,2}:\d{1,2}', date_str).group()
hour = int(time.split(u':')[0])
if is_pm:
hour += 12
minute = int(time.split(u':')[1])
second = int(time.split(u':')[2])
return datetime(year, month, day, hour, minute, second)
...全文
256 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
混沌鳄鱼 2017-09-23
  • 打赏
  • 举报
回复

# coding=utf-8
# Python2.7

import datetime

def adapter(fmt):
    def _deco(func):
        def wraper(*arg, **kwarg):
            dt = func(*arg,**kwarg)
            return dt.strftime(fmt)
        return wraper
    return _deco

@adapter(fmt='%Y/%m/%d %H:%M:%S')
def str_to_date(date_str):
    dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
    return dt

date_time = str_to_date('2017-9-23 22:15:00')
print type(date_time), date_time

<type 'str'> 2017/09/23 22:15:00 >>>
jxxx2967 2017-09-23
  • 打赏
  • 举报
回复

def sub_cn_date(m):
    text = m.group()
    return parse_cn_date(text)
diyinyu0476 2017-09-23
  • 打赏
  • 举报
回复
引用 1 楼 jxxx2967 的回复:
sub可以满足你的需求 re.sub(r"...", parse_cn_date, origin_text) 或者 regex = re.compile(r"...") regex.sub(parse_cn_date, origin_text) def parse_cn_date(m) text = m.group() ... 替换函数的参数是匹配对象,.group()可以取得内容。
嗯,可以了。 还想问一下,我已经写好了这个函数(输入unicode,输出datetime),与sub所需要的函数不一致(输入match,输出str),我不想修改这个函数,有没有什么好办法用少量的语句制作一个adapter (复制粘贴写一个新函数太蠢了)
jxxx2967 2017-09-22
  • 打赏
  • 举报
回复
sub可以满足你的需求 re.sub(r"...", parse_cn_date, origin_text) 或者 regex = re.compile(r"...") regex.sub(parse_cn_date, origin_text) def parse_cn_date(m) text = m.group() ... 替换函数的参数是匹配对象,.group()可以取得内容。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧