文件内容:
interaction
我需要搜索字符串'module',并且需要提取(.......)之间的内容;括号。
这是我尝试的代码,我无法获得结果
module traffic(
green_main, yellow_main, red_main, green_first, yellow_first,
red_first, clk, rst, waiting_main, waiting_first
);
答案 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
的捕获组*?
)
结束和;
为您提供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))])