2013-03-31 4 views
0

문자열을 regexp와 일치시키는 데 문제가 있습니다 (저는 정규 표현식에 익숙하지 않습니다). 각 단어와 태그 뒤에 슬래시가 포함 된 문자열이 있습니다. 예 : 그 문자열에서Regexp 정규식이있는 단어 내의 단어

led/O by/O Timothy/PERSON R./PERSON Geithner/PERSON ,/O the/O president/O of/O the/O New/ORGANIZATION

, 나는 /PERSON 앞에 모든 문자열에만 관심이 있습니다. 여기에 내가 생각 해낸 정규 표현식 패턴입니다 :

(\w)*\/PERSON

그리고 내 코드 :

match = re.findall(r'(\w)*\/PERSON', string) 

는 기본적으로, 나는 /PERSON 앞에 오는 모든 단어와 일치하고있다. 출력 :

>>> reg 
['Timothy', '', 'Geithner'] 

내 문제는 R./PERSON에 대한 빈 문자열에 매치 두 번째 경기는, 도트는 단어 문자되지 않는 것입니다. 나는 내 정규 표현식을 변경 :

match = re.findall(r'(\w|.*?)\/PERSON', string) 

그러나 경기는 지금 : 그것은 전에 단지 Timothy 일치하는 대신 led/O by/O을 포함하는 첫 번째/사람에게 모든 것을 가지고있다

['led/O by/O Timothy', ' R.', ' Geithner']

. 누군가가 약어로 전체 중지를 포함하면서이 일치하는 방법에 나를 도울 수 있을까요? 적어도 빈 문자열 일치가 없습니까?

감사합니다, 공백 문자 ([^ ]*)하지만

답변

1

일치 다. 또한 캡처 내부의 별표 (*)가 필요합니다 :

match = re.findall(r'([^ ]*)\/PERSON', string) 
1

첫째, (\w|.) 일치 "단어 문자 또는 문자"(점은 당신이 그 공간을 얻고있는 이유는 모든 문자와 일치). @Ionut Hulub가 지적한대로 당신이하지만 정규 표현식이 원리에 작동 뭔가를 일치하기 위해 대신 *+을 사용할 수 있습니다, (\w|\.)

둘째 : 트릭을 할 것입니다 백 슬래시이 탈출

"가장 왼쪽, 가장 긴"이므로 항상 슬래시 앞에있는 가장 긴 부분을 찾습니다.

당신이 당신이 실제로 당신이 원하는 것을 할 수있다 대신 (\w|\.)\S를 사용할 수있는 공백이 아닌 문자를 일치합니다.