2010-11-18 3 views
0

에서 정규 표현식을 사용하여 주어진 라인 (값이 자체 문자열입니다) :내가 좀 도와주세요 문제 아래에 직면하고, 내가 파이썬 안돼서 파이썬

내가 하나 개의 파일에서 라인으로 라인을 읽고, 각 라인 필드 이름과 값을 갖는, 지금 내가 라인의 line.example에 필드 이름과 filevalue을 찾아야하는 것입니다 : 일부 필드 값 자체가 내가 만들 수 없습니다 오전 그래서 문자열

line=" A= 4 | B='567' |c=4|D='aaa' " 

때문에 필드 이름과 필드 값을 검색하는 정규식.

위 예제의 경우 정규식을 알려주십시오. 출력 시도

A=4 

B='567' 

c=4 

D='aaa' 
+0

문자열에 따옴표 또는 | 표? –

+0

A = 4 | B = '567'| c = 4 | D = 'aaa' – james

+0

데이터를 다시 만들었습니다. A = 4 | B = '567'| c = 4 | D = 'aaa'내가 줄 단위로 읽는 파일에 – james

답변

0

해야이 하나

import re 

line = " A= 4 | B='567' |c=4|D='aaa' " 
re.search('(?P<field1>.*)=(?P<value1>.*)\|(?P<field2>.*)=(?P<value2>.*)\|(?P<field3>.*)=(?P<value3>.*)\|(?P<field4>.*)=(?P<value4>.*)', line).groups() 

출력 :

(' A', ' 4 ', ' B', "'567' ", 'c', '4', 'D', "'aaa' ") 

당신은 또한 대신 * \는 S 사용해 볼 수 있습니다 귀하의 필드와 값이 할 *합니다. 공백을 포함하지 않습니다.

re.search('(?P<field1>\S*)\s*=\s*(?P<value1>\S*)\s*\|\s*(?P<field2>\S*)\s*=\s*(?P<value2>\S*)\s*\|\s*(?P<field3>\S*)\s*=\s*(?P<value3>\S*)\s*\|\s*(?P<field4>\S*)\s*=\s*(?P<value4>\S*)', line).groupdict() 

출력 :

{'field1': 'A', 
'field2': 'B', 
'field3': 'c', 
'field4': 'D', 
'value1': '4', 
'value2': "'567'", 
'value3': '4', 
'value4': "'aaa'" 
} 

이 생성됩니다 관련 그룹 :

[ re.search('\s*([^=]+?)\s*=\s*(\S+)', group).groups() for group in re.findall('([^=|]*\s*=\s*[^|]*)', line) ] 

출력 :

[('A', '4'), ('B', "'567'"), ('c', '4'), ('D', "'aaa'")] 

그것이 도움이 되나요이 출력에서 ​​공백을 제거 할 것인가?

+0

키와 값 사이에 링크를 만들지 않아야합니다. 예를 들어, 'A'는 '4'와 관련이 없습니다. –

0

당신이 splitstrip으로 모든 것을 할 수있는 중첩 된 따옴표 또는 타의 추종을 불허하는 따옴표와 같은 불쾌한 일이없는 가정 : 내가 생각할 수있는

>>> line = " A= 4 | B='567' |c=4|D='aaa' " 
>>> values = dict((x.strip(" '"), y.strip(" '")) for x,y in (entry.split('=') for entry in line.split('|'))) 
>>> values 
{'A': '4', 'c': '4', 'B': '567', 'D': 'aaa'} 
+0

필자는 필연적으로 Python 초보자에게 던지는 다소 복잡한 표현 인 IMHO는 동의하지 않겠습니까? 그렇지만 스크롤의 필요성을 배제하기 위해 코드 줄의 길이를 제한하면 누구나 쉽게 답을 이해할 수 있습니다. – martineau

+0

숫자를 문자열로 처리하고, 질문에 따라 'c = 4'가 아니라 'c ='4 ''. –

+0

@ Adam Matan - 좋은 지적. 답이 바로 이것입니다. –

1

가장 간단한 해결 방법은 사전에 각 라인 변환된다. 귀하의 문자열에 아무런 인용 부호 또는 | 표시가 없다고 가정합니다 (질문에 대한 내 의견 참조).

result={}      # Initialize a dictionary 
for line in open('input.txt'): # Read file line by line in a memory-efficient way 
    # Split line to pairs using '|', split each pair using '=' 
    pairs = [pair.split('=') for pair in line.split('|')] 
    for pair in pairs: 
     key, value = pair[0].strip(), pair[1].strip() 
     try:      # Try an int conversion 
      value=int(value) 
     except:     # If fails, strip quotes 
      value=value.strip("'").strip('"') 
     result[key]=value  # Add current item to the results dictionary 

다음 입력하는 :

A= 4 | B='567' |c=4|D='aaa' 
E= 4 | F='567' |G=4|D='aaa' 

는 줄 것인가 :

{'A': 4, 'c': 4, 'B': '567', 'E': 4, 'D': 'aaa', 'G': 4, 'F': '567'} 

주 :

  • 당신이 수를 할 '567'을 고려하면, 당신이 할 수있는 "'을 정수로 변환하려고합니다.
  • 수레를 고려해야 할 경우 value=float(value)을 사용해보세요. 각 int가 부동이므로 int 변환 시도 후에이를 수행합니다.
+0

정규식을 사용하고 있지 않습니다. 위의 예제에서 정규식을 알려주세요. – Matus

+0

Pythonic 솔루션이 더 간단하다면 왜 정규식을 사용해야합니까? –

+0

질문에 답하십시오. 왜 그가 다시 사용하고 싶어하는지 모르겠다. 운동 할까? 나는 질문을 판단하지 않고 대답을 알면 대답한다. 귀하의 솔루션이 제 생각에는 간단하지 않습니다. – Matus

관련 문제