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方法,这两个函数怎么可以改进?正则表达式在这里很合适,但我很天真,所以不适用。
答案 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'