Как извлечь слово в строке, следующее за тем, которое совпадает с чем-то в списке ключевых слов - PullRequest
2 голосов
/ 24 января 2012

Я новичок в Python.Я могу разбить строку файла на слова, но не знаю, как найти слово, которое соответствует совпадению с набором ключевых слов.

    fread = open (F_FIXED_EERAM, 'r')
    KEYWORDS = ['tINT16', 'tUINT16', 'tGDT_TYPE']
    for line in fread.readlines():
        words = line.split()
        for word in words:
            if word in KEYWORDS:
    #       I want to append the word after the keyword to a new string in another file
    #       How do I get at that word?
    ...

Ответы [ 4 ]

3 голосов
/ 24 января 2012

Просто установите логическое значение для хранения следующего слова, если ключевое слово было найдено:

KEYWORDS = ['tINT16', 'tUINT16', 'tGDT_TYPE']
result = []

with open (F_FIXED_EERAM, 'r') as fread:
    for line in fread:
        store_next = False
        words = line.split()
        for word in words:
            if store_next:
                result.append(word)
                store_next = False
            elif word in KEYWORDS:
                store_next = True

result теперь представляет собой список всех слов, которым предшествует одно из KEYWORDS.

Я сделал предположение, что если последнее слово предыдущей строки является ключевым словом, то первое слово в следующей строке не нужно хранить.Если вы хотите, чтобы это поведение двигалось store_next = False за пределы (внешнего) цикла for.


Или вы можете использовать regular expression:

import re

KEYWORDS = ['tINT16', 'tUINT16', 'tGDT_TYPE']

regex = '(?:{}) +(\\w+)'.format('|'.join(map(re.escape, KEYWORDS)))

with open ('in.txt', 'r') as file_:
    print(re.findall(regex, file_.read()))

Это может выглядеть как магия, но используется фактическое регулярное выражение:

(?:tINT16|tUINT16|tGDT_TYPE) +(\w+)

Что означает: соответствует одному из ключевых слов, за которым следует один или несколько пробелов, за которыми следует слово.?: в начале говорит Python не хранить эту группу.\w эквивалентно [a-zA-Z0-9_] (в зависимости от флагов LOCALE и UNICODE).

1 голос
/ 24 января 2012

Вы можете использовать enumerate(words), давая вам следующее

for i, word in enumerate(words):
  if word in KEYWORDS:
    if(i+1<len(words)):
      str.append(word[i+1])

Или вы можете использовать библиотеку re http://docs.python.org/library/re.html. Здесь вы можете указать регулярное выражение, которое будет легко разбирать конкретные значения прямо в массиве

0 голосов
/ 24 января 2012

Самый простой способ сделать это - отследить слово, которое вы видели последний раз в цикле.Если это слово является одним из ваших ключевых слов, то слово current является словом, следующим за ним.Естественно написать это как генератор.Также удобно написать генератор, который возвращает отдельные слова (токены) из файла.

def tokens_from(filename):
    with open(filename) as f:
        for line in f:
            for token in line.split():
                yield token

def keyword_values(filename, *keywords):
    keywords = set(keywords)
    previous = None
    for token in tokens_from(filename):
        if previous in keywords:
            yield token
        previous = token

Теперь вы можете поместить слова в список:

result = list(keyword_values(F_FIXED_EERAM, 'tINT16', 'tUINT16', 'tGDT_TYPE'))

Или выможет создать строку:

result = " ".join(keyword_values(F_FIXED_EERAM, 'tINT16', 'tUINT16', 'tGDT_TYPE'))

Или вы можете перебрать их и записать в файл:

with open("outfile.txt", "w") as outfile:
   for outword in keyword_values(F_FIXED_EERAM, 'tINT16', 'tUINT16', 'tGDT_TYPE'):
       print outword
0 голосов
/ 24 января 2012

Может быть, вам нужен следующий код.Обратите внимание, что если ключевое слово появляется в конце строки, вам необходимо добавить специальную обработку.

newstring = ''
fread = open (F_FIXED_EERAM, 'r')
KEYWORDS = ['tINT16', 'tUINT16', 'tGDT_TYPE']
for line in fread.readlines():
    words = line.split()
    for i in range(0,len(words)-1):
        if words[i] in KEYWORDS:
            newstring += words[i+1]
...