2012-01-24 4 views
2

Je suis un nouveau venu dans Python. Je peux diviser une ligne d'un fichier en mots, mais je n'ai pas trouvé comment obtenir le mot qui suit une correspondance à un ensemble de mots clés.Comment extraire un mot dans une chaîne après celle qui correspond à quelque chose dans une liste de mots-clés

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? 
    ... 
+0

il semble que vous l'avez presque où êtes-vous Tu échoues? – monkut

Répondre

0

Peut-être que le code suivant est ce que vous voulez. S'il vous plaît noter que si le mot-clé apparaît à la fin de la ligne, vous devez ajouter un traitement spécial.

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] 
3

Il suffit de définir un booléen pour stocker le mot suivant si un mot clé a été trouvée:

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 est maintenant une liste de tous les mots qui il a été précédé par l'un des KEYWORDS. J'ai fait l'hypothèse que si le dernier mot de la ligne précédente est un mot-clé, le premier mot de la ligne suivante ne doit pas être stocké. Si vous voulez ce comportement, déplacez store_next = False en dehors de la boucle (externe) for.


Ou vous pouvez utiliser un 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())) 

Cela pourrait ressembler à la magie, mais cela est l'expression régulière réelle utilisée:

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

Ce qui se traduit par: correspondre à un des les mots-clés suivis d'un ou plusieurs espaces suivis d'un mot. Au début, ?: dit à Python de ne pas stocker ce groupe. \w est équivalent à [a-zA-Z0-9_] (en fonction des indicateurs LOCALE et UNICODE).

+2

n'utilisez pas 'pour la ligne dans le fichier.readlines(): '; faire 'pour la ligne dans le fichier:'. – jfs

+2

utilisez ''|' .join (map (re.escape, KEYWORDS))' pour protéger contre un mot-clé contenant un symbole regex non sécurisé. – jfs

+0

Les deux bons points @ J.F.Sebastian, fixant maintenant. –

1

Vous pouvez utiliser enumerate(words) vous donnant les éléments suivants

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

Vous pouvez également utiliser la bibliothèque rehttp://docs.python.org/library/re.html. Ici vous pouvez spécifier une expression régulière et facilement analyser des valeurs spécifiques directement dans un tableau

0

La façon la plus simple de faire cela est de garder une trace du mot que vous avez vu le dernier temps à travers la boucle. Si ce mot est l'un de vos mots clés, alors le mot actuel est le mot qui suit. Il est naturel d'écrire ceci comme un générateur. Il est également pratique d'écrire un générateur qui renvoie les mots individuels (jetons) d'un fichier.

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 

Maintenant vous pouvez obtenir les mots dans une liste:

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

Ou vous pouvez construire une chaîne:

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

Ou vous pouvez itérer sur eux et les écrire à un fichier:

with open("outfile.txt", "w") as outfile: 
    for outword in keyword_values(F_FIXED_EERAM, 'tINT16', 'tUINT16', 'tGDT_TYPE'): 
     print outword 
Questions connexes