2013-10-24 1 views
2

크로스 워드 컴파일러에서 작업하고 있습니다.패턴의 일부가 선택적 인 정규 표현식입니다.

예를 들어, 두 번째 자리에는 'U', 네 번째 자리에는 'E', 여섯 번째 자리에는 'E'가있는 빈칸 8 개가 있습니다.

_U_E_E___ 나는 내가이 일치하는 단어를 얻기 위해 노력하고있는 단어 목록이 있습니다. 이 패턴 (TUBELESS)으로 8 자의 단어를 찾으면 멋지다!. 그러나 처음 4 슬롯 (TUBE)과 만 일치하는 4 글자 단어를 찾을 수 있다면 그 단어도 사용할 수 있습니다.

가능한 길이마다 하나의 RE를 가질 수 있으며 '|' 그러나 나는 더 우아한 해결책을 찾고있다. 도움? 당신이 원하는 일치와

답변

1

사용하여 중첩 된 옵션 그룹 : .U.E(?:.(?:E(?:..?)?)?)?$

당신은 패턴 구축하는 간단한 재귀 함수를 사용할 수 있습니다

: (거의 같은 패턴하지만 심지어 마지막 문자를 그룹에 싸여 얻을)

def nested_pattern(s): 
    if s: 
     return '(?:' + s[0] + nested_pattern(s[1:]) + ')?' 
    else: 
     return '' 

import re 
regex = re.compile(r'.U.E' + nested_pattern(r'.E..') + '$') 

for word in ('TUB', 'TUBE', 'TEBU', 'TUBES', 'PURETE', 'TUBELEX', 'TUBELESS', 'SURELY'): 
    print word, bool(regex.match(word)) 

인쇄물

0

4 ~ 8 문자열은 다음과 같습니다이 "더 우아한"하지만 그것은 내다 흥미로운 그림의 경우

>>> p = re.compile('^[A-Z]U[A-Z]E(?=[A-Z](?=E(?=[A-Z](?=[A-Z]$|$)|$)|$)|$)') 
>>> re.match(p, 'TUB') 
>>> re.match(p, 'TUBE') 
<_sre.SRE_Match object at 0x10fe55ac0> 
>>> re.match(p, 'TUBX') 
>>> re.match(p, 'TUBEL') 
<_sre.SRE_Match object at 0x10fe55b28> 
>>> re.match(p, 'TUBELE') 
<_sre.SRE_Match object at 0x10fe55ac0> 
>>> re.match(p, 'TUBELEX') 
<_sre.SRE_Match object at 0x10fe55b28> 
>>> re.match(p, 'TUBELES') 
<_sre.SRE_Match object at 0x10fe55ac0> 
>>> re.match(p, 'TUBELESS') 
<_sre.SRE_Match object at 0x10fe55b28> 
>>> re.match(p, 'TUBELESSY') 
>>> re.match(p, 'TUBELESS7') 
>>> re.match(p, 'TUBELEZZ') 
<_sre.SRE_Match object at 0x10fe55ac0> 
>>> re.match(p, 'TUBELE88') 

잘 모르겠어요. 어쩌면 그것은 당신을위한 아이디어를 생성 할 것인가?

+0

이것은 실제로 앞을 내다 보는 재미있는 사용법입니다. 내가하고 싶은 일을해라. 하지만 Janne Karila와 함께보다 포괄적 인 대답을 찾아야합니다. 감사. –

0
text = "_U_E_E___" 
def solve(text, word_list): 
    for word in word_list: 
     matches = 0 
     for c1, c2 in zip(text, word): 
      if not(c1 == c2 or c1 == '_'): 
       break 
      matches += 1 
     if matches >= 4: 
      return word 


print solve(text, ['TXBELESS', 'TUBE']) 
print solve(text, ['TXBELESS', 'TUBx', 'TUBELESS', 'TUBEL']) 

출력 : 여기에

TUBE 
TUBELESS 
+0

이 코드는 작동하지만 정규 표현식을 찾고있었습니다. –

1

은 약간 더 간결 정규 표현식입니다. 사전에있는 단어에 숫자가 없으므로 영숫자가 일치해도 문제가되지 않는다고 가정합니다. 그렇지 않은 경우 \w[A-Z]으로 바꾸십시오.

import re 

#REGEX EDIT: 
#added so that the expression can't be embedded in another string 
#^= beginning, $ = end 

#to match words that are either 4 or 8 characters long: 
#specify a group of 4 letters at the end, then match it 0 or 1 times with "?" 
regex = re.compile(r"^\wU\wE(\wE\w{2})?$") 

x = 'TUBELESS' 
y = 'TUBE' 

#both these options return a match object 
#meaning they fit the regular expression 
regex.match(x) 
regex.match(y) 
+0

Ref : http://www.pythonregex.com/ 'TUBE'와 'TUBEXXX'둘 다 내가 찾던 것과 일치하지 않는 지정된 RE와 일치하는 개체를 반환합니다. 감사. –

+0

네 말이 맞아. 문자열 내에서 표현식을 찾으면 match 함수가 true를 반환한다는 사실을 잊어 버렸습니다. 시작과 끝 문자를 추가하여 작동되게했습니다. – xgord

관련 문제