2013-03-14 4 views
1

폴더의 텍스트 파일을 구문 분석하고 특정 검색 단어 주위에 텍스트를 저장하는 코드가 있습니다.여러 단어와 일치하는 루비 스캔

그러나 동시에 여러 단어에 대해 작동하도록 코드를 편집하는 데 문제가 있습니다. 결과를 모든 텍스트에 그룹화하지 않고 모든 텍스트 파일에 그룹화하려는 경우 전체 코드를 반복하지 않으려 고합니다.

all_documents.scan("(word1|word2|word3)") 또는 유사한 정규 표현식 변형을 사용하면 작동하지 않는 것 같습니다.

#helper 
     def indices text, index, word 
     padding = 20 
     bottom_i = index - padding < 0 ? 0 : index - padding 
     top_i = index + word.length + padding > text.length ? text.length : index +   word.length + padding 
     return bottom_i, top_i 
    end 

    #script 
    base_text = File.open("base.txt", 'w') 
    Dir::mkdir("summaries") unless File.exists?("summaries") 
    Dir.chdir("summaries") 

    Dir.glob("*.txt").each do |textfile| 
     whole_file = File.open(textfile, 'r').read 
     puts "Currently summarizing " + textfile + "..." 
     curr_i = 0 
     str = nil 
     whole_file.scan(/trail/).each do |match| 
      if i_match = whole_file.index(match, curr_i) 
      top_bottom = indices(whole_file, i_match, match) 
      base_text.puts(whole_file[top_bottom[0]..top_bottom[1]] + " : " +   File.path(textfile)) 
      curr_i += i_match      
      end 
     end 
     puts "Done summarizing " + textfile + "." 
    end 
    base_text.close 

아이디어가 있으십니까?

답변

9

Regexp.union()을 사용할 수 있습니다. 그것은 당신이 원하는 것을 정확히 수행합니다.

코드에서

, 그것은

... 
whole_file.scan(Regexp.union(/trail/, /word1/, /word2/, /word3/)).each do |match| 
... 
+0

완벽한합니다. 그것은 작동합니다. 감사! – Seeb

0

될 것 내가 당신에게 (/[\w']+/에 의해 예를 들어) 단어입니다 아무것도 scan 더 나은 생각하고 scan의 블록 내에서, $&은 특정의 일치 여부를 확인 말. scan이 관심이없는 단어와 일치하게 된 경우 아무 잘못이 없습니다. 그냥 무시하십시오.

1

Regexp.union을 사용할 수 있지만 이는 하위 문자열 일치만을 생성합니다. 전체 단어를 일치 시키려면 좀 더 많은 작업이 필요합니다. 내가 사용하십시오 :

/\b(?:#{ Regexp.union(%w[trail word1 word2 word3]).source })\b/ 
=> /\b(?:trail|word1|word2|word3)\b/ 

결과 패턴이 하위 문자열을 무시하고, 전체 단어를 찾습니다 :

foo = /\b(?:#{ Regexp.union(%w[trail word1 word2 word3]).source })\b/ 
# /\b(?:trail|word1|word2|word3)\b/ 

words = %w[trail word1 word2 word3] 
words.join(' ').scan(foo) 
# [ 
#  [0] "trail", 
#  [1] "word1", 
#  [2] "word2", 
#  [3] "word3" 
# ] 

words.join.scan(foo) 
# [] 

'trail word1word2 word3'.scan(foo) 
# [ 
#  [0] "trail", 
#  [1] "word3" 
# ] 
관련 문제