Python模拟strtime beh

2024-03-28 20:56:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python程序,它从许多源代码获取文件,来自同一源代码的所有文件都有相同的格式,但是格式差别很大。一个源的格式可以是ServerName-ProccessID-Date另一个可以是(Date)\u Username\u ProccessID\u Server。目前,要使用新格式添加新源代码,需要编码器为每个源代码编写一个解析函数

我已经开始编写一个新的适配器,并希望将文件格式存储为字符串。第一个类似于%S-%P-%D,第二个类似于(%D)%U%P\%S

在python3中最好的方法是什么


Tags: 文件方法函数字符串程序dateserver源代码
1条回答
网友
1楼 · 发布于 2024-03-28 20:56:19

这样做是合理的:

import re
from collections import namedtuple

Format = namedtuple('Format', 'name format_string regex')
class Parser(object):
    replacements = [Format('server', '%S', r'[A-Za-z0-9]+'),
                    Format('user', '%U', r'[A-Za-z0-9]+'),
                    Format('date', '%D', r'[0-9]{4}-[0-9]{2}-[0-9]{2}'),
                    Format('process_id', '%P', r'[0-9]+'),
                    ]

    def __init__(self, format):
        self.format = format
        self.re = re.compile(self._create_regex(format))

    def _create_regex(self, format):
        format = re.escape(format)
        for replacement in self.replacements:
            format = format.replace(r'\%s' % replacement.format_string,
                                    r'(?P<%s>%s)' % (replacement.name,
                                                     replacement.regex,
                                                     ),
                                    )
        return format

    def parse(self, data):
        match = self.re.match(data)
        if match:
            return match.groupdict()
        return None

用法:

a_parser = Parser("(%D)%U_%P_%S")
print a_parser.parse("(2005-04-12)Jamie_123_Server1")

b_parser = Parser("%S - %P - %D")
print b_parser.parse("Server1 - 123 - 2005-04-12")

输出:

{'date': '2005-04-12', 'process_id': '123', 'user': 'Jamie', 'server': 'Server1'}
{'date': '2005-04-12', 'process_id': '123', 'server': 'Server1'}

本质上,我是在自定义格式语法中的%?与预定义正则表达式之间创建映射,以匹配该参数,然后用相应的regex替换给定格式字符串中的%?字符串,从而为该模式构建解析器

只有在格式字符串中分隔“type”的字符没有出现在它的regex中,或者如果没有分隔符,那么并排的两个regex就不会相互“干扰”时,这种方法才会起作用。例如,使用格式字符串:

%U%P

我分配给上面userprocess_id的正则表达式,不可能知道user结束和process_id在这个字符串中开始的位置:

User1234

User1234还是User1234还是其他组合?但是,即使是人类也不能解决这个问题

相关问题 更多 >