2013-12-07 3 views
2

나는 단어와 그 복수형의 보조 정리를 얻는 작은 모듈을 가지고있다. 그런 다음 두 단어 (단수 또는 복수)가 포함 된 문장을 찾는 문장을 순서대로 검색합니다. 나는 그것이 작동하고있다 그러나 더 우아한이 표정을 건설하는 방법 있으면 나는 생각해보고 있었다. 감사! 참고 : Python2파이썬 정규식 중 하나 또는 그 케이스

words = ((cell,), (wolf,wolves)) 
string1 = "(?:"+"|".join(words[0])+")" 
string2 = "(?:"+"|".join(words[1])+")" 
pat = ".+".join((string1, string2)) +"|"+ ".+".join((string2, string1)) 
# Pat output: "(?:cell).+(?:wolf|wolves)|(?:wolf|wolves).+(?:cell)" 

그런 다음 검색 :

pat = re.compile(pat) 
for sentence in sentences: 
    if len(pat.findall(sentence)) != 0: 
     print sentence+'\n' 
+0

성능이 문제가되는? 아니면 코드 검토를 찾고 있습니까? – roippi

+4

이 질문은 codereview를 요구하기 때문에 주제와 관련이없는 것으로 보입니다. 그것은 이동해야합니다 [codereview.stackoverflow.com] (http://codereview.stackoverflow.com) –

+0

성능은 주요 관심사, 네. –

답변

0

뭔가 같은 :

[ x for x in sentences if re.search('\bcell\b', x) and 
     (re.search('\bwolf\b', x) or re.search('\bwolves\b', x))] 
+0

3 개의 re.search() 호출을 실행하면 성능이 저하 될 것입니다. 이 모듈은 한 번에 수천 문장에 사용되므로 속도가 큰 문제입니다. –

+0

@ JesseTravis 첫 번째 일치시 __not__ 중지를 수행하는'findall'을 사용하고 있으며 패턴도 훨씬 더 복잡합니다. 위의 버전에서'\ bcell \ b'을 찾을 수 없으면 멈추고 두 개의 다른 정규 표현식을 실행하지 않을 것입니다. –

+0

이 부분을 살펴 보겠습니다. 나는 re.search ('\ bcell', x)가 복수의 '셀'을 잡을 필요가 있다고 생각한다. –

0

문제는 당신이 여러 화합물보기 주위에 표현을 추가하기 시작하여 알고리즘의 복잡성 통제를 벗어난다. 이것은 정규 표현식을 사용하여이 문제를 해결하는 근본적인 문제가 될 것입니다.

또 다른 방법은에 대해 질의 한 후 하나의 O (N)는 Counter와 문장 당 통과하게 시도하는 것입니다

#helper function 
def count_lemma(counter,*args): 
    return sum(counter[word] for word in args) 

from collections import Counter 
from string import punctuation 

for sentence in sentences: 
    c = Counter(x.rstrip(punctuation).lower() for x in sentence.split()) 
    if all(count_lemma(c,*word) for word in words): 
     print sentence 
관련 문제