如何从字符串中提取匹配关键词列表中的单词后的单词

2 投票
4 回答
7297 浏览
提问于 2025-04-17 10:56

我刚开始学习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 个回答

0

也许下面的代码就是你想要的。请注意,如果关键词出现在行的末尾,你需要做一些特别的处理。

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

你可以使用 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。在这里,你可以指定一个正则表达式,轻松地把特定的值直接解析到一个数组里。

3

只需要设置一个布尔值来存储下一个单词,如果找到了关键字的话:

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 循环外面。


或者你可以使用一个 正则表达式

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_](具体取决于地区和 Unicode 标志)。

撰写回答