如何在一行中搜索字符串并在python中的两个字符之间提取数据?

时间:2019-02-13 15:46:12

标签: python python-3.x

文件内容:

interaction

我需要搜索字符串'module',并且需要提取(.......)之间的内容;括号。

这是我尝试的代码,我无法获得结果

module traffic(
    green_main, yellow_main, red_main, green_first, yellow_first, 
    red_first, clk, rst, waiting_main, waiting_first
);

2 个答案:

答案 0 :(得分:2)

您的代码存在问题:

for line in contents:
    if 'module' in line:

此处,contents是一个单个字符串,用于保存文件的全部内容,而不是字符串(行)或可以逐行循环的文件句柄的列表。因此,您的line实际上不是一行,而是该字符串中的单个字符,显然,它绝不会包含子字符串"module"

由于您实际上从未在循环中使用 line,因此只需删除循环和条件,代码就可以正常工作。 (并且,如果您将代码更改为实际循环行,并且在这些行内插入find,则由于()不在同一行上,因此将无法正常工作。)


或者,您可以使用正则表达式:

>>> content = """module traffic(green_main, yellow_main, red_main, green_first, yellow_first, 
...                red_first, clk, rst, waiting_main, waiting_first);"""
...
>>> re.search("module \w+\((.*?)\);", content, re.DOTALL).group(1)
'green_main, yellow_main, red_main, green_first, yellow_first, \n               red_first, clk, rst, waiting_main, waiting_first'

这里,module \w+\((.*?)\);的意思是

  • 单词module后跟一个空格和一些单词类型的\w字符
  • 文字开头(
  • 具有任何(...),包括换行符(.),非贪婪re.DOTALL的捕获组*?
  • 文字{@ {1}}和)结束

;为您提供group(1)对(非转义)对之间的发现

如果您希望将这些作为列表:

(...)

答案 1 :(得分:1)

如果要提取“(””)之间的内容,可以执行以下操作:(但首先要注意如何处理内容):

for line in content.split('\n'):
    if 'module' in line:
        line_content = line[line.find('(') + 1: line.find(')')]

如果您的内容不仅在一行中:

import math 
def find_all(your_string, search_string, max_index=math.inf, offset=0,):
    index = your_string.find(search_string, offset)

    while index != -1 and index < max_index:
        yield index
        index = your_string.find(search_string, index + 1)

s = content.replace('\n', '')

for offset in find_all(s, 'module'):
    max_index = s.find('module', offset=offset + len('module'))
    if max_index == -1:
        max_index = math.inf
    print([s[start + 1: stop] for start, stop in zip(find_all(s, '(',max_index, offset), find_all(s, ')', max_index, offset))])