使用正则表达式查找python函数调用

2024-04-28 13:41:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一种将模块定义为

<module_name> <inst_name>(.<port_name> (<net_name>)….);

或者

module1 inst1 ( .input a,
.output b;
port b=a;);

我想找到所有这样的模块,同时忽略函数调用。你知道吗

我很难用正则表达式。我在找这个

 text1 text2 ( .text3; text4 );

请注意,除文本1和文本2之间的空格外,所有空格都是可选的,可能是新行而不是空格.text3和text4可以是多行的,但都是

text3 - >
.blah1 (blah2),
.blah3 (blah4)

text4->
blah1 blah2=xyz;
blah3 blah4=qwe;

我正在努力

 re.split(r"^[a-zA-Z]*\s[a-zA-Z]*\s?\n?\([a-zA-Z]*\s?\n?;[a-zA-Z]*\);", data)

不起作用尽管如此。它抓住一切。我该怎么修?谢谢!! 最终,我确实需要单独获取所有内容(模块/实例/端口/网络)。我想我可以在正则表达式运行后将其拆分。你知道吗


Tags: 模块name文本定义portmodule空格za
1条回答
网友
1楼 · 发布于 2024-04-28 13:41:08

我认为,在尝试提取信息之前,您需要编写一个对语言有足够理解的解析器,以便至少规范化它。您可以手工编写一个简单的解析器,也可以使用PLY或类似的解析框架。你知道吗

为了让你对我的建议有一个更具体的想法,考虑一下 下面的代码定义了一个parse_data函数 一个文件的内容,将产生一系列在 该文件:

import re

tokens = {
    'lparen': '\(',
    'rparen': '\)',
    'comma': ',',
    'semicolon': ';',
    'whitespace': '\s+',
    'equals': '=',
    'identifier': '[.\d\w]+',
}

tokens = dict((k, re.compile(v)) for k,v in tokens.items())

def parse_data(data):
    while data:
        for tn, tv in tokens.items():
            mo = tv.match(data)
            if mo:
                matched = data[mo.start():mo.end()]
                data = data[mo.end():]
                yield tn, matched

使用这个,你可以写一些东西,将你的样本输入 转化为规范形式:

with open('inputfile') as fd:
    data = fd.read()

last_token = (None, None)
for tn, tv in parse(data):
    if tn == 'whitespace' and last_token[0] != 'semicolon':
        print ' ',
    elif tn == 'whitespace':
        pass
    elif tn == 'semicolon' and last_token[0] == 'rparen':
        print tv
    else:
        print tv,

    last_token = (tn, tv)

给定如下输入:

module1 inst1 ( .input a,
.output b;
port b=a;);
module2 inst2 ( .input a, .output b; port b=a;);

module3 inst3 ( .input a, .output b;


port b=a;);

上述代码将产生:

module1   inst1   (   .input   a ,   .output   b ; port   b = a ; ) ;
module2   inst2   (   .input   a ,   .output   b ; port   b = a ; ) ;
module3   inst3   (   .input   a ,   .output   b ; port   b = a ; ) ;

因为它是标准形式,所以更容易修改 通过简单的模式匹配提取信息。你知道吗

请注意,虽然此代码依赖于读取整个源文件 首先,您可以非常容易地编写解析 如果您关心内存利用率的话,请使用片段文件。你知道吗

相关问题 更多 >