2013-04-17 3 views
-5

안녕하세요, 아래의 모든 코드를 통해 데이터에서 특정 정보를 추출 할 수있게되었습니다. 누군가가 이것을 사용하여 더 적절하게 쓸 수있게 도와 주길 바랍니다. 많은 선 지금 난 단지이 실제로 더 나은 for loop로 이루어집니다"While()"을 파이썬에서 사용하는 방법

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 


import re 

tableau = [] 

data = "00:02:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6499" 

result1 = {} 
i = re.findall(r"^.[^\ ]*", data) 
j = re.findall(r"\d+$", data) 
k = re.findall(r"O:[^\ ]*", data) 
r = re.findall(r"R:[^\ ]*", data) 

result1 = {'Heure':i,'MID':j,'Source':k,'Destination':r} 

data = "00:03:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6599" 

result2 = {} 
i = re.findall(r"^.[^\ ]*", data) 
j = re.findall(r"\d+$", data) 
k = re.findall(r"O:[^\ ]*", data) 
r = re.findall(r"R:[^\ ]*", data) 

result2 = {'Heure':i,'MID':j,'Source':k,'Destination':r} 

tableau.append(result1) 
tableau.append(result2) 

print tableau 
+3

while while은 Python 키워드이므로 "While()'"기능은 없습니다. (또한 특정 데이터 집합을 반복 할 때 'for' 루프를 원할 것입니다.) – geoffspear

+0

'while '은 여러분이 원하는 것이라고 생각하지 않습니다. 내가 이해하는 바와 같이 일반적으로 문자열 목록으로 '데이터'를 갖게됩니다. 그런 경우에 'for..in ..'루프를 사용하십시오. – sashkello

+0

질문을 명확히하십시오 - 반복 할 내용이 명확하지 않습니다. – sashkello

답변

6

) = 누군가가 도움이 될 수 있습니다, 그래서 만약 내가 그래서 내가 배울 수있는 설명이 아니라 그냥 복사 및 붙여 넣기하시기 바랍니다 초보자이야 두 줄 (데이터)가 :

data1 = "00:02:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6499" 
data2 = "00:03:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6599" 
data_list = [ data1, data2 ] #store the data in a list so we can iterate over it 
tableau = [] #create a list to hold our output 
for data in data_list: #iterate over the list, getting 1 "data" at a time 
    #extract info we want 
    i = re.findall(r"^.[^\ ]*", data) 
    j = re.findall(r"\d+$", data) 
    k = re.findall(r"O:[^\ ]*", data) 
    r = re.findall(r"R:[^\ ]*", data) 

    #create dictionary and append it to tableau 
    tableau.append({'Heure':i,'MID':j,'Source':k,'Destination':r}) 

고급 사용자는 아마도 여기에 함수 무형 문화 유산은 입력으로 문자열을 받아 원하는 데이터의 사전 반환

def extract(data): 
    i = re.findall(r"^.[^\ ]*", data) 
    j = re.findall(r"\d+$", data) 
    k = re.findall(r"O:[^\ ]*", data) 
    r = re.findall(r"R:[^\ ]*", data) 
    return {'Heure':i,'MID':j,'Source':k,'Destination':r} 

지금 당신이 list comprehension이 사용할 수 있습니다 : 당신은을 얻는 것 같은 코멘트에서

tableau = [extract(data) for data in data_list] 

를, 그것은 본다 파일의 데이터 행. 그게 더 낫습니다 (누가 그 모든 문자열을 입력하고 싶습니까?). - (문맥 관리자) with 다른 파이썬 구조를 도입하여

with open('filename') as fin: 
    tableau = [extract(data) for data in fin] 

: 이제 우리는이 단축 될 수 있습니다. 좀 더 복잡하지만 파일을 여는 방법이 좋습니다. 파일 개체의 경우 기능적으로 다음과 같습니다.

fin = open('filename') 
tableau = ... 
fin.close() 
+0

감사합니다 !!!!!!! –

+0

이것은 문제에 대한 훌륭한 접근 방법입니다. 그러나 훨씬 더 빠르기 때문에 정규 표현식을 사용하는 것이 좋습니다. –

+0

그래, 파이썬 2.6에서는 사용할 수 없다./ –

0

나는 기대하는 바를 수행하는 가장 좋은 방법이라고 생각하지 않습니다. 아마도 사용할 수 있습니다

for data in dataArray: 

여기서 dataArray에는 데이터 문자열이 포함되어 있습니다.

3

여기에 있습니다. 이렇게하면 훨씬 더 효율적인 방법으로 데이터를 구문 분석하고, 데이터 목록을 피드 할 수있는 함수를 사용합니다. 이것을 발전기로 바꾸고 싶다면 매우 쉽습니다.

import re 

def parser(data): 
    result = [] 
    for p in data: 
     ms = re.match(r'(\S+).*?(O:\S+).*(R:\S+).*mid:(\d+)', p) 
     if not ms: 
      continue 
     result.append({'Heure':ms.group(1), 'Source':ms.group(2), 'Destination':ms.group(3), 'MID':ms.group(4)}) 
    return result 


data = ["00:02:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6499", 
     "00:03:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6599"] 

print parser(data) 

결과

import re 

def parser(data): 
    for p in data: 
     ms = re.match(r'(\S+).*?(O:\S+).*(R:\S+).*mid:(\d+)', p) 
     if not ms: 
      continue 
     yield {'Heure':ms.group(1), 'Source':ms.group(2), 'Destination':ms.group(3), 'MID':ms.group(4)}  

data = ["00:02:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6499", 
     "00:03:12.935 mta   Messages  I Doc O:NVS:FAXG3/ R:NVS:SMTP.0/[email protected] mid:6599"] 

for r in parser(data): 
    print r 

결과 :

>>> 
{'Source': 'O:NVS:FAXG3/', 'Destination': 'R:NVS:SMTP.0/[email protected]', 'Heure': '00:02:12.935', 'MID': '6499'} 
{'Source': 'O:NVS:FAXG3/', 'Destination': 'R:NVS:SMTP.0/[email protected]', 'Heure': '00:03:12.935', 'MID': '6599'} 

발전기로서

>>> 
[{'Source': 'O:NVS:FAXG3/', 'Destination': 'R:NVS:SMTP.0/[email protected]', 'Heure': '00:02:12.935', 'MID': '6499'}, 
{'Source': 'O:NVS:FAXG3/', 'Destination': 'R:NVS:SMTP.0/[email protected]', 'Heure': '00:03:12.935', 'MID': '6599'}] 

내 정규식 @mgilsonsanswer 아이디어를 사용 :

def extract(data): 
    ms = re.match(r'(\S+).*?(O:\S+).*(R:\S+).*mid:(\d+)', data) 
    if not ms: 
     raise Exception('Could not extract data') 
    return {'Heure':ms.group(1), 'Source':ms.group(2), 'Destination':ms.group(3), 'MID':ms.group(4)} 

tableau = [extract(data) for data in data_list] 
+0

이 정규 표현식을 고쳐 주셔서 감사합니다 inbar님께 고맙습니다! –

+0

반송 사전을 수정했습니다. ms 그룹에서 실수를했습니다. 내 편집을 확인하십시오. –

+0

REGEX를 쓰는 방식이 마음에 들지만, 익숙하지는 않습니다. 내가 시도한 것을 추출하기 위해 어떻게 다시 쓰겠습니까 (O : NVS : \ S +). 가치 (O : NVS : FAXG3) 나는 그것이 단지 [email protected]을 반환하고 싶습니다 (R : NVS : \ S +)와 FAXG3 및 동일한 것을 반환하고 싶습니다 잘 간략히 목표는 얻을 것입니다 발신자 메시지의 유형 및 발신자와 대상 메시지의 유형 및 대상, 충분히 명확합니까? –

0

감사를 Wooble이 While 기능과 예 영감을 위해. 그 아이디어는 내가 그것을 어떻게하는지 생각하게했다.

>>> def While(function, *args, **kwargs): 
    while function(*args, **kwargs): pass 


>>> def unstack(array): 
    print(array.pop()) 
    return array 

>>> While(unstack, ['world!', 'there', 'Hello']) 
Hello 
there 
world! 

>>> def fib(state): 
    state.append(sum(state)) 
    print(state.pop(0)) 
    return state[0] < 1000 

>>> While(fib, [0, 1]) 
0 
1 
1 
2 
3 
5 
8 
13 
21 
34 
55 
89 
144 
233 
377 
610 
987 
>>> 

발전기도 오히려 좋은이다, 그래서 WhileGenerator 내 호기심을 충족 할뿐만 아니라 창조되었다.

>>> def WhileGenerator(function, *args, **kwargs): 
    iterator = iter(function(*args, **kwargs)) 
    while next(iterator): 
     yield next(iterator) 


>>> import operator, functools, itertools 
>>> for value in WhileGenerator(lambda a, b: functools.reduce(operator.add, 
     itertools.zip_longest(a, b)), 
     (True, True, True, False), 
     'Hello there world!'.split()): 
    print(value) 


Hello 
there 
world! 
>>> def fib_gen(state, limit): 
    while True: 
     yield state[0] < limit 
     state.append(sum(state)) 
     yield state.pop(0) 


>>> for value in WhileGenerator(fib_gen, [0, 1], 1000): 
    print(value) 


0 
1 
1 
2 
3 
5 
8 
13 
21 
34 
55 
89 
144 
233 
377 
610 
987 
>>> 
관련 문제