2011-09-26 5 views
4

내가정규식

^1?$|^(11+?)\1+$ 

, 파이썬에서 정규 표현식 아래의이 매칭이 들어

^1?$ 

, 나는이 정규식으로 분할됩니다, 그것은해야 1 또는 비어 있음 값을 확인하십시오. 나 맞아?

^(11+?)\1+$ 

상기 정규식 들어,이 값 (1111)의 제 11 쌍은 (11 +?)에 기초하여 11 번째 쌍 인해 \ 1이다를 검증한다.

파이썬에서 실행하려고하면 1111에만 true를 반환하고 11이나 빈 값은 반환하지 않습니다. 내가 어딘가 틀렸어?

+3

흠, 프라임 대 복합 번호를 사용하는 하나의 시작과 끝이 :이 같은 정규식을 작성합니다? – tchrist

+0

예, 정규식을 작성하려고합니다. 너 괜찮아. :) – Ted

+0

@tchrist, 멋지게 발견! '111111111' (9'1's)과 일치하는 것을 보았을 때 다소 난처한 상황이었습니다. 그런 다음'\ 1 +'이 3 번 3'1'과 일치하는 것을 보았습니다. :) –

답변

2

테드가 쓴이 들어

, 그것은 1 또는 빈 값을 확인해야합니다. 나 맞아?

네, 맞습니다.

테드는 썼다 : 나는 파이썬에서 그것을 실행하려고하면 사실 반환

만에 1111하지만 11 빈 값을. 내가 어딘가 틀렸어?

빈 문자열 과 일치합니다. 다음 코드 :

#!/usr/bin/env python 
import re 

for n in xrange(0, 51): 
    ones = '1' * n 
    matches = re.match(r'^1?$|^(11+?)\1+$', ones) 
    if matches: 
    div1 = n if matches.group(1) is None else len(matches.group(1)) 
    div2 = 0 if div1 is 0 else len(ones)/div1 
    print "[{0:2}]:{1:2} * {2:2} = '{3}'".format(n, div1, div2, ones) 

인쇄 것이다

[ 0]: 0 * 0 = '' 
[ 1]: 1 * 1 = '1' 
[ 4]: 2 * 2 = '1111' 
[ 6]: 2 * 3 = '111111' 
[ 8]: 2 * 4 = '11111111' 
[ 9]: 3 * 3 = '111111111' 
[10]: 2 * 5 = '1111111111' 
[12]: 2 * 6 = '111111111111' 
[14]: 2 * 7 = '11111111111111' 
[15]: 3 * 5 = '111111111111111' 
[16]: 2 * 8 = '1111111111111111' 
[18]: 2 * 9 = '111111111111111111' 
[20]: 2 * 10 = '11111111111111111111' 
[21]: 3 * 7 = '111111111111111111111' 
[22]: 2 * 11 = '1111111111111111111111' 
[24]: 2 * 12 = '111111111111111111111111' 
[25]: 5 * 5 = '1111111111111111111111111' 
[26]: 2 * 13 = '11111111111111111111111111' 
[27]: 3 * 9 = '111111111111111111111111111' 
[28]: 2 * 14 = '1111111111111111111111111111' 
[30]: 2 * 15 = '111111111111111111111111111111' 
[32]: 2 * 16 = '11111111111111111111111111111111' 
[33]: 3 * 11 = '111111111111111111111111111111111' 
[34]: 2 * 17 = '1111111111111111111111111111111111' 
[35]: 5 * 7 = '11111111111111111111111111111111111' 
[36]: 2 * 18 = '111111111111111111111111111111111111' 
[38]: 2 * 19 = '11111111111111111111111111111111111111' 
[39]: 3 * 13 = '111111111111111111111111111111111111111' 
[40]: 2 * 20 = '1111111111111111111111111111111111111111' 
[42]: 2 * 21 = '111111111111111111111111111111111111111111' 
[44]: 2 * 22 = '11111111111111111111111111111111111111111111' 
[45]: 3 * 15 = '111111111111111111111111111111111111111111111' 
[46]: 2 * 23 = '1111111111111111111111111111111111111111111111' 
[48]: 2 * 24 = '111111111111111111111111111111111111111111111111' 
[49]: 7 * 7 = '1111111111111111111111111111111111111111111111111' 
[50]: 2 * 25 = '11111111111111111111111111111111111111111111111111' 

그리고 적어도 한번 반복되어야 11 그룹 1 ((11+?))에 일치하기 때문에 11 일치하지 않는 입력 (\1+)를 , 그것은 사실이 아닙니다 (반복되지 않습니다).

+0

정규식의 첫 번째 집합에 대해^1 $, 빈 값이 일치하지만 왜 1 또는 11이 일치하지 않습니까?^1과 11의 일치는 1에 맞기 때문에 1?과 일치합니다. – Ted

+0

@Ted, 빈 문자열 및''1 "'_are_ matched. 내 (약간) 편집 된 답변보기. –

+0

감사! 나는'(^ 1? $) '에 대해 착각했다. 메타 문자 (0 또는 1)로 인해 1 또는 11을 의미한다고 생각했습니다. – Ted

0

\1이 탐욕스러운 1 개 이상을 의미하면 +입니다.

1 번을 1 ~ 4 번 찾으시겠습니까?

사용 :

r'^(1+){1,4}$' 

가장 쉬운 거기 밖으로 좋은 정규식 도구 중 하나를 사용하는 것입니다. 여기 my favorite. 같은 사이트에서 왜 your regex does not work을 볼 수 있습니다.

여기 사이트는 explains regex's입니다.

+0

'\ 1' 다음에'+'를 쓰거나 넣지 않은 상태에서, 입력 ""11 "'은 여전히 ​​일치하지 않으며 빈 문자열 _이 일치합니다. 다른 말로하면,'+'는 제가 문제가 아니라는 것을 이해하는 것입니다. 내가 물건을 잘못 해석하지 않는다면 ... –

+0

@Bart Kiers : OP가 무엇을하려고하는지 잘 모르겠다 ;-) 나는 그것을 정규식을 분리하고 두 번째 매치를 1,11 , 111 또는 1111입니다. 그의 정규 표현식은 해당 집합에서 1111과 일치합니다. – dawg

+0

Err, no,' "1"'도 일치합니다. 나는 그것이 약간 불분명하다는 것에 당신과 동의한다! :) –

0

두 번째 표현식이 '11', '1111', '111111'등과 일치하도록하려면사용 :

^(1+)\1$ 
0

난 당신이 |가 참조하는 것을 정의하기 위해 더 많은 괄호가 필요하다고 생각.

/^(1?|^(11+?)\2+)$/ 

노트 정규 표현식에를 통해 단항 표기

+0

아니요, 정확히'^ 1? $ |^(11 +?) \ 1 + $'와 똑같습니다. –