2013-04-04 1 views
0

사용자 입력 와일드 카드를 사용하여 사전에서 파이썬으로 검색 할 수 있기를 원합니다.Python : 사용자 입력 와일드 카드를 사용한 정규 표현식

이걸 발견 :

import fnmatch 
lst = ['this','is','just','a','test', 'thing'] 
filtered = fnmatch.filter(lst, 'th*') 

이이와 일을 일치합니다. 이제 전체 파일을 입력하여 검색하려고 시도하면

with open('testfilefolder/wssnt10.txt') as f: 
file_contents = f.read().lower() 
filtered = fnmatch.filter(file_contents, 'th*') 

과 일치하지 않습니다. 차이점은 내가 읽는 파일에서 텍스트 파일 (셰익스피어 플레이)이므로 공백이있어 목록이 아니라는 점입니다. 나는 하나의 편지와 같은 것을 매치 할 수있다. 그래서 나는 단지 't'가 있다면 나는 많은 것을 얻는다. 따라서 이것은 하나의 글자를 매치시키고 있음을 말해줍니다 - 그러나 나는 전체 단어를 매치시키고 싶습니다 - 그러나 더 많은 것은 와일드 카드 구조를 보존하기 위해서입니다.

내가 원했던 것은 사용자가 텍스트 (와일드 카드 문자 포함)를 입력하면 'th *'가있는 위치로 대체 할 수 있다는 것입니다. 와일드 카드는 여전히해야 할 일을 할 것입니다. 그 질문에, 나는 단지 'th *'에 대한 검색 텍스트를 담고있는 변수를 사용할 수 있습니까? 이것은 일에 대해 갈 수있는 올바른 방법을 th.*\Z(?ms)

를 출력

regex = fnmatch.translate('th*') 
print(regex) 

: 나는 어떻게 든 예를 들어 '번째 *'를 번역 하죠과 같은 무언가를 발견 한 경우 일부 조사 후 궁금 이? 그것이 필요한지 나는 모른다.

"정규식 수식 전달"에 대한 가장 좋은 방법은 무엇이며 코드의 두 번째 세트에서 들어오는 텍스트 문자열에서 작동하지 않으므로 코드에서 내가 잘못 생각한 것일 수도 있습니다. 그것이 첫 번째에서 (정확하게) 그렇듯이.

+3

왜 ['re'] (http://docs.python.org/library/re.html)를 사용하지 않으시겠습니까? – n1xx1

답변

1

"공백이 있고 목록이 아닙니다"라는 문제가 있다면 목록으로 만들지 않으시겠습니까?

with open('testfilefolder/wssnt10.txt') as f: 
file_contents = f.read().lower().split(' ') # split line on spaces to make a list 
filtered = fnmatch.filter(file_contents, 'th*') 
+0

크리스에게 감사드립니다. 먼저 파이썬에서 이러한 것들을 작성하는 방법을 배우려고 노력하고 있습니다. (꽤 새로운 것입니다.) 그러나 수천 개의 파일을 결합해야하므로 최종적으로해야하는지 확실하지 않습니다. 목록이 나에게 좋은 소리, 나는 이것이 최선의 선택인지 알고 싶다. 다시 한 번 감사드립니다. – Relative0