2012-06-11 5 views
1

@으로 시작하고 ;, ., : 또는  으로 끝나는 단어는 어떻게 일치합니까?@user와 정규 표현식을 일치 시키려면

단어는 영숫자를 가질 수 있으며 밑줄로 구성 될 수 있습니다.

나는 하나의 단어 문장만으로 작동하는 것처럼 보이는 ^@([a-zA-Z0-9_])*[:;, ]$을 생각해 냈습니다.

+0

우리가 얘기하는 트위터이므로 15 자 (사용자 이름 최대 길이)로 제한하려고합니다. –

답변

3

^[:;, ]을 수정하는 것은 당신이 그들을 제거 할 필요가 있으므로, (멀티 라인 모드 또는 라인 등) 문자열의 시작과 일치 :

>>> import re 
>>> sentence = "foo bar @match don't match @success;" 
>>> re.findall('@([a-zA-Z0-9_])*[:;, ]', sentence) 
['h', 's'] 

한정자 (*)가 캡처와 일치하는 대괄호 밖에 있으므로 마지막 문자 만 캡처합니다. 내부를 이동하고 당신이 얻을 :

>>> re.findall('@([a-zA-Z0-9_]*)[:;, ]', sentence) 
['match', 'success'] 

당신이 너무 @ 및 후행 문자를 캡처 할 경우, 단지뿐만 아니라 괄호 내부로 이동 :

>>> re.findall('(@[a-zA-Z0-9_]*[:;, ])', sentence) 
['@match ', '@success;'] 

을 그리고에 코멘트에 언급 한 바와 같이 ,

>>> sentence = "foo bar @match don't match @somereallylongnamehere @success;" 
>>> re.findall('(@[a-zA-Z0-9_]{1,15}[:;, ])', sentence) 
['@match ', '@success;'] 

(물론, 길이 제한이 이전 표현 중 하나에 추가 할 수 있습니다뿐만 아니라 일 : 질문, 당신은 또는 문자의 특정 숫자로 제한하지 않을 수있다 마지막 하나입니다.)

+1

아! 이제 캡쳐 그룹 밖에 * 놓습니다. 감사! –

4

앵커 ^$을 제거하면 도움이 될 것입니다.

"Example @ nothing"의 빈 문자열과 일치시키지 않으려면 * 대신 "1 개 이상의 한정자"+을 지정할 수 있습니다. 1-15 자에게 자명 제한 즉 @([a-zA-Z0-9_]+)[:;, ]

, 즉 @([a-zA-Z0-9_]{1,15})[:;, ]{1,15}*로 대체함으로써 수행 될 수있다.

@ 기호와 끝 문자를 결과로 사용하려면 @[a-zA-Z0-9_]{1,15}[:;, ]이면 충분합니다.

만 이름을 캡처하려는 경우, 당신은이 @([a-zA-Z0-9_]{1,15})[:;, ]

경우 토큰이 바로 문자열의 끝에서와 특수 문자없이 사용할 수 있으며, 당신이 그것을 캡처하려면, 당신은 할 수 있습니다 $이 말과 일치하면서 (?:[:;, ]|$)

관련 문제