2017-10-25 18 views
1

일부 단어가 하나의 단어이거나 여러 단어가 여러 단어이거나 일부 단어에 하이픈이 있거나 다른 단어에 괄호와 하이픈이있을 수 있습니다. 텍스트 파일의 디렉토리를 처리하고이 구문 중 100 개 이상을 검색 한 다음 발생 횟수를 계산하려고합니다.텍스트 파일에 특수 문자가있는 특정 구문을 검색하고 계산하십시오.

다음 코드는 하이픈으로 연결된 검색 문구가 나타날 때까지 2.7x Python에서 작동하는 것처럼 보입니다. 하이픈 처리 된 검색 구문 중 적어도 하나에 대해 일부 텍스트 파일에서 예기치 않은 계산을 보았습니다.

kwlist = ['phraseone', 'phrase two', 'phrase-three', 'phrase four (a-b-c) abc', 'phrase five abc', 'phrase-six abc abc'] 
for kws in kwlist: 
    s_str = kws 
    kw = re.findall(r"\b" + s_str +r"\b", ltxt) 
    count = 0 
    for c in kw: 
     if c == s_str: 
      count += 1 
    output.write(str(count)) 

검색에서 구문의 범위를 처리하는 더 좋은 방법이나 내가 알고리즘에 대해 개선 할 수있는 점이 있습니까?

+0

정확하게 작동하지 않는 것을 알려주십시오. 오류 메시지가 나타 납니까? 그 예기치 않은 결과를 게시물에 추가하십시오. – voiDnyx

+0

오류 메시지가 없습니다. 지금까지 문제는 텍스트 파일에서 'phrase-six abc abc'와 같은 것이 나오면 검색중인 텍스트 파일 하나 이상에 대해 계산이 너무 많아졌습니다. 아직도 다른 사람들을 확인 중입니다. –

+0

어쩌면 틀린 것으로 생각되는 문구와 실제 문구가 포함 된 텍스트 구절을 제공 할 수도 있습니다. 이것은 당신의 regex 사용에 대한 문제와 더 비슷합니다. – voiDnyx

답변

1

당신은 이것을 pythonic 한 줄짜리 전화로 할 수 있습니다.

우리는 우리가 사용할 수있는 등의 regex을 사용하여 귀찮게 할 필요가 없습니다

내장 .count() 방법,하는 것입니다 문서에서 :

string.count(s, sub[, start[, end]])

돌아 숫자의 문자열 s에서 하위 문자열 sub (중첩되지 않음)가 발생합니다 [시작 : 종료]. 시작과 끝의 기본값과 음수 값의 해석은 조각의 경우와 같습니다.

그래서 우리가 할 필요는 stringltxt에서 kwlist에서 각 키워드의 발생까지 sum입니다. 이것은 list-comprehension으로 수행 할 수 있습니다

바와 같이 @voiDnyx's comment 지적

output.write(str(sum([ltxt.count(kws) for kws in kwlist]))) 

업데이트, 위의 솔루션 writes모든 countssum이 아닌 각각의 키워드.

당신은 각 키워드를 출력하려면

, 당신은 단지 write 개별적으로 list에서 각자가 할 수

counts = [ltxt.count(kws) for kws in kwlist] 
for cnt in counts: 
    output.write(str(cnt)) 

이 작동하지만 당신은 바보 얻을 한 줄에 모두 넣어하기를 원한다면, 귀하는 잠재적으로 다음과 같이 할 수 있습니다 :

[output.write(str(ltxt.count(kws))) for kws in kwlist] 

당신에게 달려 있습니다. 는 :)


당신이 단어 경계와 일치해야하는 경우, 다음 예를 그렇게 할 수있는 유일한 방법은 regex\b을 사용하는 것입니다. 이것은 여전히 ​​한 줄로 할 수 없다는 것을 의미하지 않습니다.

[output.write (str (len (re'findall (r '\ b'+ re.이스케이프 (kws) + r '\ b'))) kws에 대한 kwlist]

키워드는 special 문자가 포함될 수 있으므로 re.escape이 어떻게 필요한지 유의하십시오.

+0

나는 각 kws에 대한 카운트가 원한다고 생각한다. 내가 잘못한 것이 아니라면 모든 kws의 카운트를 요약하고 있는가? 그래서 기본적으로 그냥 아무 말도하지 말고 그냥 반환/카운트 목록을 인쇄하십시오. – voiDnyx

+0

@voiDnyx 아, 내 실수는 대답을 업데이트 할 것입니다 –

+0

제안 된 코드와 한 줄을 보내 주셔서 감사합니다. 나는 그것을 시도하고 그것은 키워드와 전체 일치의 일부를 찾았지만, 키워드의 전체 일치뿐만 아니라. 나는 또한 스크립트를 샅샅이 뒤져 매우 긴 키워드 목록에 누락 된 따옴표가 있다는 것을 알았습니다. 그것은 내 산출물에서 한 필드에 의해 카운트를 버렸다. 따라서 다른 옵션이 없으면 kw = re.findall (r "\ b"+ s_str + r "\ b", ltxt)는 키워드 목록에서 전체 구를 찾는 방법입니다. ? –