2013-04-16 5 views
1

문자열에서 길이 6의 영숫자를 찾으려면 정규식을 사용해야합니다. 문자열은 뭔가 다음과 같다 :문자열에서 영숫자 패턴을 찾는 정규식

PLT\n\nTRAVELLER NAME LIST\n\n  TRAVELLER    RECLOC COMPANY\n 1   TESTNUMBERFIVEQA/TESTN WL9795\n 2 TESTNUMBERONEYQWA/TEST RHFQCD\n 3 TESTNUMBERONEYQWAZZZ/T 1QZ1JF\n 4 TESTNUMBERONEYQWAZZZM/ N3BZW8\n 5 TESTNUMBERONEYQWAZZZMK 05RXPM\n 6 TESTNUMBERONEYQWAZZZMK 2XR9ZR\n 7 TESTNUMBERTHREEZZZ/TES 0Q14S4\n 8 TESTNUMBERTHREEZZZM/TE LRRKW3\n 9 TESTNUMBERTHREEZZZMK/T 949Z4T\n 10 TESTNUMBERTHREEZZZMKJ/ 51WFM2\n 11 TESTNUMBERTWOZZA/TESTN PRGWVT\n 12 TESTNUMBERTWOZZAZZZ/TE SM0BHS\n 13 TESTNUMBERTWOZZAZZZM/T QRJLH1\n 14 TESTNUMBERTWOZZAZZZMK/ R69NHV\n 15 TESTNUMBERTWOZZAZZZMKJ 67XKF7\n 16 TESTNUMBERTWOZZAZZZMKJ 68PV7P\n 17 TESTNUMBERTWOZZAZZZMKJ GCZZ0C\n)> 18 TESTNUMBERTWOZZAZZZMKJ MLMS3L\n 19 TESTNUMBERTWOZZAZZZMKJ 3R1S49\n 20 TESTNUMBERTWOZZAZZZMKJ WB700R\n 21 TESTNUMBERTWOZZAZZZMKJ 718KRC\n 22 TESTNUMBERTWOZZAZZZMKJ RTQH2H\n 23 TESTNUMBERTWOZZAZZZMKJ N2FLM6\n 24 TESTNUMBERTWOZZAZZZMKJ 40M1FR\n 25 TESTNUMBERTWOZZAZZZMKJ 71D3HF\n 26 

내가 시도 정규식은 다음과 같이이다 :

for k in mainString: 
    m = re.match('([0-9A-Z]{6})', k) 
    if (m): 
     do something 

그러나 예상대로 그 작동하지 않습니다. 누군가 내가 실수를 저지를 수 있다고 지적 할 수 있습니까? 내가 찾고 있어요 패턴은

감사

답변

4

문자열의 시작 부분에서 일치하는 match 방법은 검사 등 WL9795, RHFQCD, 같다.

대신 search 방법을 사용하십시오!

또한 ()도 필요하지 않습니다.

코드의 mainString이 실제로 질문 맨 위에있는 문자열 인 경우 for 루프가 해당 문자열의 모든 개별 문자를 반복하므로 코드가 올바르게 작동하지 않습니다. 정규식은 \b 문자열 이스케이프 시퀀스로 취급되지 않도록하기 전에

대신 당신은

m = re.search(r'\b[0-9A-Z]{6}\b', mainString) 
if (m): 
    print(m.group()) 

r를 사용할 수 있습니다.

\b은 단어 경계를 의미하며 6 자의 영숫자 앞에 단어 문자가 오거나 앞에 오지 않도록합니다. 그들 없이는 첫번째 일치는 "TRAVEL""TRAVELLER"에있을 것입니다.

모든 일치 항목의 목록을 보려면 search 대신 findall 또는 finditer을 사용하십시오.

for m in re.finditer(r'\b[0-9A-Z]{6}\b', mainString): 
    print(m.group()) 
+0

에서 foobar 일치한다 : m = re.search ('[0-9A-Z] {6}, K) if (m) : 무언가를하십시오 위와 비슷한 것을 가지고 있지만 진전이 없습니다! – RAB

+0

런타임 예외 : 인수 1은 _sre.SRE_Match가 아닌 문자열 또는 읽기 전용 문자 버퍼 여야합니다 .SRE_Match – RAB

+0

findall이 작동했습니다. 감사합니다. – RAB

3

당신이 거기에 일부 단어 경계를 할 수 있습니다 나에게 보인다

>>> print re.findall(r'\b\w{6}\b',s) 
['RECLOC', 'WL9795', 'RHFQCD', '1QZ1JF', 'N3BZW8', '05RXPM', '2XR9ZR', '0Q14S4', 'LRRKW3', '949Z4T', '51WFM2', 'PRGWVT', 'SM0BHS', 'QRJLH1', 'R69NHV', '67XKF7', '68PV7P', 'GCZZ0C', 'MLMS3L', '3R1S49', 'WB700R', '718KRC', 'RTQH2H', 'N2FLM6', '40M1FR', '71D3HF'] 

이 정규식은 긴 정확히 문자입니다 영숫자 패턴을 일치합니다. 즉, "foobarbaz" 아무것도 일치하지는 않지만 그 mainString에서 k에 대한 "foobar."

+0

re.findall (r '\ b (\ w {6}) \ b $ ', s, re.M)는'RECLOC '특이 값을 제거합니다. – pyInTheSky

+0

이것은 내가 찾고있는 원하는 패턴이 아닙니다. 노력 덕분에 감사합니다. – RAB

+0

@pyInTheSky 줄의 끝이 단어 경계가 될 것이기 때문에'$'가 마지막'\ b'을 중복되게 만들 것이라고 가정합니다 ...'re.findall (r '\ b \ w {6} $' s, re.M)' – mgilson

관련 문제