2009-10-18 6 views
0

mystring = '14 | "전처리 기 프레임 수가 증가하지 않음 카드 : 마더 보드, 포트 : 2"| minor "문자열 필터링/조작을 더 효과적으로 수행

그래서 세 개의 요소 (ID, 메시지 및 레벨)를 파이프 ("| ")로 나눈 값이 있습니다. 나는이 작은 기능 쓴 있도록 각 요소를 얻으려면 : 그것은 잘 작동 지금

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 

을하지만 난이 그것을 해결하기 위해 파이썬 방법은이 두 기능을 향상시킬 수 수 있는지,없는 것 같은 느낌? 정규 표현식은 여기에 맞는 것처럼 느껴지지만 그다지 순진하지 않아 적용 할 수 없습니다.

+0

실제로 분할은 아마도이 문제를 해결하는 좋은 방법 일 것입니다. 정규 표현식은 과잉 공격 일 가능성이 높습니다. 당신은 replace()를 사용하는 대신 strip()의 문자 중 하나로 넣을 수도 있습니다. – Amber

답변

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(' "') 
+0

내 해시지도의 라인을 따라 맡은 일. –

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' 
+0

commands.getstatusoutput()을 사용하여 얻은 쉘 스크립트의 출력에서 ​​정확하게 파싱됩니다. 어떻게 문자열을 검색 할 수 있습니다. – Hellnar

+1

난 그 문제는 당신이 여전히 그 요소를 얻기 위해 정확히 똑같은 일을하고 있다고 생각하지만 대신 무명의 함수 호출 뒤에 일반 작업을 숨기고있다 – SilentGhost

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

당신은 약간의 낭비입니다 귀하의 문자열을 두 번 나누고있어 그 수정 이외의 사소한 있습니다.

5

나는 가장 비옥 한 방법은 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() 
0

당신이 게터 기능이 필요하지 않으면이 잘 작동합니다 :

>>> 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를'그림자 피하기

관련 문제