更好的方法来进行字符串过滤/操作

时间:2009-10-18 11:23:23

标签: python string

mystring = '14 | “预处理器帧数不增加;卡:主板,端口:2”|次要'

所以我有3个元素(id,message和level)除以pipe(“|”)。我想得到每个元素,所以我写了这些小函数:

    def get_msg(i):
        x = i.split("|")
        return x[1].strip().replace('"','')

    def get_level(i):
        x = i.split("|")
        return x[2].strip()
 #testing
print get_msg(mystring ) # Missing Input PID,   PID: 20 : Port 4 of a static component
print get_level(mystring )# major

现在它运作良好,但我觉得这不是解决它的pythonic方法,这两个函数怎么可以改进?正则表达式在这里很合适,但我很天真,所以不适用。

5 个答案:

答案 0 :(得分:5)

我认为最pythonic的方法是使用csv模块。 来自PyMotW的分隔符选项:

import csv
import sys

f = open(sys.argv[1], 'rt')
try:
    reader = csv.reader(f, delimiter='|')
    for row in reader:
        print row
finally:
    f.close()

答案 1 :(得分:2)

lst = msg.split('|')
level = lst[2].strip()
message = lst[1].strip(' "')

你将你的字符串拆分两次这有点浪费,除了修改是次要的。

答案 2 :(得分:1)

我认为最佳做法是实际拥有更好的格式化字符串,或者不使用字符串。为什么它是一个字符串?你在哪里解析这个?一个数据库? XML?原点可以改变吗?

{ 'id': 14, 'message': 'foo', 'type': 'minor' }

我认为这样的数据类型是最佳实践,如果它存储在数据库中,然后将其拆分为多个列。

编辑:我可能会因此而被扔石头,因为它可能过度/低效但是如果你稍后添加很多部分,你可以将它们存储在漂亮的哈希映射中:

>>> formatParts = {
...     'id': lambda x: x[0],
...     'message': lambda x: x[1].strip(' "'),
...     'level': lambda x: x[2].strip()
... }
>>> myList = mystring.split('|')
>>> formatParts['id'](myList)
'14'
>>> formatParts['message'](myList)
'Preprocessor Frame Count Not Incrementing; Card: Motherboard, Port: 2'
>>> formatParts['level'](myList)
'minor'

答案 3 :(得分:1)

class MyParser(object):
    def __init__(self, value):
        self.lst = value.split('|')
    def id(self):
        return self.lst[0]
    def level(self):
        return self.lst[2].strip()
    def message(self):
        return self.lst[1].strip(' "')

答案 4 :(得分:0)

如果你不需要getter函数,这应该很好用:

>>> m_id,msg,lvl = [s.strip(' "') for s in mystring.split('|')]
>>> m_id,msg,lvl
('14', 'Preprocessor Frame Count Not Incrementing; Card: Motherboard, Port: 2',
'minor')

注意:避免遮蔽内置函数'id'