首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python模拟strptime行为

Python模拟strptime行为
EN

Stack Overflow用户
提问于 2014-07-14 13:27:03
回答 1查看 45关注 0票数 1

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

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

在python3中,最好的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-14 14:15:28

这样的事情是合理的:

代码语言:javascript
复制
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

用法:

代码语言:javascript
复制
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")

输出:

代码语言:javascript
复制
{'date': '2005-04-12', 'process_id': '123', 'user': 'Jamie', 'server': 'Server1'}
{'date': '2005-04-12', 'process_id': '123', 'server': 'Server1'}

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

这只有在格式字符串中分隔"type“的字符没有出现在regex中,或者如果没有分隔符时,才能工作,那么并排的两个正则表达式不会”干扰“对方。例如,使用格式字符串:

代码语言:javascript
复制
%U%P

我在上面分配给userprocess_id的正则表达式不可能知道userprocess_id从哪个字符串开始:

代码语言:javascript
复制
User1234

这是User1234User1234,还是其他的组合?但是,即使是人类也无法解决这个问题!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24737606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档