2016-02-05 3 views
-1

Допустим, что у меня есть текстовый файл. которые я должен читать, и это будет так:Python Найдите n слов до и после определенных слов

... Department of Something is called (DoS) and then more texts and more text... 

, а затем «а» Я читаю текстовый файл, который я нашел аббревиатуру, здесь

DoS 

Таким образом, для нахождения аббревиатуры я написал :

import re 
import numpy 

# open the file? 
test_string = " a lot of text read from file ... Department of Something is called (DoS) and then more texts and more text..." 
regex = r'\b[A-Z][a-zA-Z\.]*[A-Z]\b\.?' 

found= re.findall(regex, test_string) 
print found 

и выход:

['DoS'] 

то, что я хочу сделать, это:

  1. ПОКА Я читаю файл найти и аббревиатуру (здесь DoS),
  2. вычислить количество символов того, что я нашел (здесь 3 символов для DOS)
  3. найти 2 раза (здесь 2x3 = 6) слова ПЕРЕД И ПОСЛЕ «ДОС». здесь будет:

    3.1 pre=  Department of Something is called 
    3.2 acronym= DoS 
    3.3 post= and then more texts and more 
    
  4. положить эти 3 (pre, акроним, сообщение) в массив.

Любая помощь будет оценена, так как я новичок в python.

+3

Это довольно запутанное описание. – timgeb

+0

@timgeb Я сделал все возможное, чтобы описать его – Rebin

+0

@Rebin, пожалуйста, немного более ясно –

ответ

1

Не уверен, что это лучшее решение, но, возможно, этого достаточно, чтобы помочь вам.

import re 
import numpy 

# open the file? 
test_string = " a lot of text read from file ... Department of Something is called (DoS) and then more texts and more text..." 
regex_acronym = r'\b[A-Z][a-zA-Z\.]*[A-Z]\b\.?' 

ra = re.compile(regex_acronym) 
for m in ra.finditer(test_string): 
    print m.start(), m.group(), m.span() 
    n = len(m.group()) * 2 
    regex_pre_post = r"((?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,%d})(" % n 
    regex_pre_post += regex_acronym 
    regex_pre_post += ")((?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,%d})" % n 
    found= re.findall(regex_pre_post, test_string) 
    print found 

    found = found[0] # For a single match, just do this. 
    pre = found[0] 
    acro = found[1] 
    post = found[2] 
    print pre, acro, post 

Даст вам:

69 DoS (69, 72) 
[('file ... Department of Something is called (', 'DoS', ') and then more texts and more')] 
file ... Department of Something is called (DoS) and then more texts and more 
+0

Спасибо, это очень правильный ответ. За исключением того, что я хочу, чтобы эти 3 компонента (pre, acronym, post) были разделены. теперь они находятся в списке, и когда я «распечатаю найденный [0]», он печатает все. как я могу отделить эти 3? – Rebin

+1

См. Отредактированную версию. –

+0

спасибо. очень правильно. Другой вопрос. использует регулярное выражение для этого вопроса? – Rebin

Смежные вопросы