2011-10-13 4 views
2

내가 루아 파일 세트에 저장된 일부 값을 구문 분석하는 몇 가지 정규식을 얻으려고 일치하지 않을 각 행이 두 라인 중 하나 같은 형태파이썬 정규식 패턴이

  1. ITEM.ID = 'item_clock';\r\n
  2. ITEM.Cost = 150;\r\n .

내가 첫 번째 줄에 내 정규식 패턴을 실행는 내가 두 번째 줄에 그것을 실행할 때, 나는 Match 개체를 얻을하지 않습니다 예상 결과를

>>> re.search("ITEM.(?P<key>[a-zA-Z]\w) = (?P<value>.*);", line).groupdict() 
{'key': 'ID', 'value': "'item_clock'"} 

를 얻을.

답변

7

정규식은 정확히 하나 개의 단어 문자 (정규식에서 \w) 다음에 다음에 문자 ITEM.을 찾습니다.

아마 당신은 ITEM.(?P<key>[a-zA-Z]\w*) ...과 같은 것을 의미했을 것입니다 (별표가 추가되었습니다). 그러면 ITEM. 다음에 문자가 이어지고 0 이상 단어 문자가옵니다.

r"ITEM.(?P<key>[a-zA-Z]\w*) = (?P<value>.*);" 

합니다 (r 접두사 주) :

또한, 어려운 자리 버그를 방지하기 위해 정규 표현식 raw strings을 사용하는 것이 좋습니다.

+0

덕분에 완벽하게 작동했습니다. 난 그냥 정규식 주위에 내 머리를 얻을 시작했습니다. – H4Z3Y

+2

@ H4Z3Y : 방금 원시 문자열에 대한 메모를 추가했습니다. 나는 들어가는 것이 좋은 습관이라고 생각한다. – NPE

+0

괜찮아요, 건배, 이제 그걸했습니다 – H4Z3Y

1

수락 된 답변이 맞습니다. 경미한 비틀기 ...

  • "." ITEM 뒤에는 "." 그리고 "="

    R "ITEM 주변 단지 아무것도 보통

  • 하나 개 이상의 공간 (또는 공백)를 허용하는 것이 좋습니다. \ (? P < 키 > [A-ZA-Z ] \ w *) * = * (? P < 값 >. *?) *; "

+0

나는 도트로 그랬던 것처럼 공간을 벗어나는 것이 좋은 생각이라고 생각합니다. – heltonbiker

+0

"\ *"를 "\ s \ *"로 대체하는 것이 가장 좋습니다 ... 정규 표현식과 같이 더 나은 정규 표현식을 사용하면 더 좋은 정규 표현식을 얻을 수 있습니다. –

+0

실제로'\'(공백 문자 포함) ,하지만 결국에는 개인적인 취향을위한 많은 "공간"(말장난 의도)이 있다고 생각합니다. 그래서 그것은 'r "ITEM \. (? P [a-zA-Z] \ w *) \ * = \ * (? P . *?) *;"' ( – heltonbiker