首页 > 解决方案 > 如何在一行中搜索字符串并在python中的两个字符之间提取数据?

问题描述

文件内容:

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

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

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

fp = open(file_name)
contents = fp.read()
unique_word_a = '('
unique_word_b = ');'
s = contents

for line in contents:
    if 'module' in line:
        your_string=s[s.find(unique_word_a)+len(unique_word_a):s.find(unique_word_b)].strip()
        print(your_string)

标签: pythonpython-3.x

解决方案


您的代码的问题在这里:

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

这里,contents是包含文件全部内容的单个字符串,而不是字符串列表(行)或可以逐行循环的文件句柄。因此,您line实际上不是一行,而是该字符串中的单个字符,显然永远不能包含 substring "module"

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


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

>>> 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),非贪婪*?
  • 字面上的结束);

group(1)让您在(非转义)对之间找到什么(...)

如果你想要这些作为列表:

>>> list(map(str.strip, _.split(",")))
['green_main', 'yellow_main', 'red_main', 'green_first', 'yellow_first', 'red_first', 'clk', 'rst', 'waiting_main', 'waiting_first']

推荐阅读