Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python在不同实例中分割verilog路径的正则表达式模式_Python_Regex_String_Verilog - Fatal编程技术网

使用Python在不同实例中分割verilog路径的正则表达式模式

使用Python在不同实例中分割verilog路径的正则表达式模式,python,regex,string,verilog,Python,Regex,String,Verilog,我有一个解析Verilog路径的软件,负责将这些路径映射到一系列对象。问题是找到一个正则表达式,以实例名称序列分割Verilog路径 Verilog路径是由点连接的Verilog标识符序列。每个标识符都是一个实例名。A.B.C中的“.”关系意味着,在模块层次结构中,A是父级,B是A的子级之一。C是B的子级之一 每个Verilog路径标识模块层次结构中的唯一实例 伪代码: Verilog Identifier A Verilog Identifier B Verilog Identifier C

我有一个解析Verilog路径的软件,负责将这些路径映射到一系列对象。问题是找到一个正则表达式,以实例名称序列分割Verilog路径

Verilog路径是由点连接的Verilog标识符序列。每个标识符都是一个实例名。A.B.C中的“.”关系意味着,在模块层次结构中,A是父级,B是A的子级之一。C是B的子级之一

每个Verilog路径标识模块层次结构中的唯一实例

伪代码:

Verilog Identifier A
Verilog Identifier B
Verilog Identifier C
作为A的子级的父B的实例C的路径:

    A.B.C
现在的问题是,Verilog标识符可以是“字母、数字、下划线(u)和美元符号($)的任意序列。标识符的第一个字符只能是字母或下划线”,如本页所述:

在这种情况下,Python只需编写以下代码即可拆分路径:

>>> path = "a.verilog.path"
>>> print path.split(".")
['a', 'verilog', 'path']
不幸的是,标识符可以是转义标识符

转义标识符以反斜杠开始,以空格结束。在反斜杠和空格中,可以有任何字符(空格除外),甚至点

\an_escaped_identifier_that_ends_with_space
\another-identifier,withsome.dots)insideit_ending_withspace 
所以事情变得越来越复杂,你不能再依赖split了。 下面是一个例子:

Verilog Identifier identifier1
Verilog Identifier \escaped.identifier_2 
Verilog Identifier identifier3
父级\escape.identifier_2的实例标识符3的路径,该标识符是标识符1的子级:

    identifier1.\escaped.identifier_2 .identifier3
那么,我们如何使用Python的
re
模块来处理由任意数量的标识符和/或转义标识符组成的所有可能的Verilog路径呢?

([a-z][a-z0-9$\]*\\\s*)
应该匹配常规标识符和转义标识符


一种方法是使用正则表达式将转义字符串中的点替换为一些特殊标记,如
|
,然后像以前一样在点上拆分。后记如果你想回点,你可以用每个标识符中的点替换你的特殊标记

比如:

重新导入
path=“我们是一个法律制定者。\path.yep.mhmmm\U 3.这里什么都没有”
dot\u mask=re.compile(r'(\\[A-Za-z|]+)\.(?=[^\s]*\s))
屏蔽路径=路径
while(重新搜索(点屏蔽,屏蔽路径)!=None):
屏蔽路径=re.sub(点屏蔽,r'\g | | |',屏蔽路径)
蒙版_标识符=蒙版_路径。拆分('.'))
unmask=re.compile(r'\\{2}')
无掩码_标识符=[]
对于范围(0,len(掩码_标识符))中的i:
unmasked_标识符.append(re.sub(unmask,'.',masked_标识符[i]))

演示:

这似乎是一个很好的答案:假设路径是一个有效的Verilog路径,它似乎可以工作(我对它进行了一些测试)。现在我试图理解在解析之前验证路径可能需要做的检查,但这可能是另一个问题。无论如何,竖起大拇指!这有点复杂。我认为这是可行的,但当正则表达式变长时,就很难确定了。我认为我们可以通过添加完整的Python代码和改进测试来完成答案。首先
import re
,然后执行
re.compile(r“([a-z_][a-z0-9$\\\\\S*)”)。拆分[1:-1]
,其中[1:-1]删除列表开头和结尾的空字符串。该列表现在由标识符和点分隔符组成。是否有快速删除点的方法保留单字符串命令?:)根据Will Barnwell的建议,我正在编辑此答案,以包含Python代码并完成此操作。根据已接受的答案,我认为我遗漏了您问题中的某些内容,你只是想要一个匹配单个verilog标识符的正则表达式模式,还是想要某种将路径解析为单个标识符的解决方案?好吧,我看到你现在正在努力改进这个答案,通常一个策略是,除非你觉得答案完全回答了你的问题,否则不要接受答案,即使这样,也要推迟24小时。一旦一个问题有了公认的答案,大多数用户,比如我自己,都不愿意回答这个问题。最快的答案可能会很好,但投入更多时间的答案最终会更好。我明白了,我同意。那么,关闭勾号还是保持现状更好呢?是的,如果没有人给出更好的答案,并且你对某个特定的答案感到满意,那么就接受它。不幸的是,在我的情况下,我现在很忙,也许我稍后会回答:我认为性能测试有助于了解哪种方法更快,您的方法还是正则表达式方法。老实说,我认为使用正则表达式作为拆分标记,然后清除
”。
列表中的元素是更优雅的解决方案,我只是觉得这是另一种可以考虑的方法。我刚刚创建了这个要点,对单一正则表达式方法进行了一个小测试。它可以用来进行Python和C++在这一操作中的定性性能比较。注意,与Python一样,正则表达式的编译需要很多时间,因此最好在程序开始时只编译一次。我不打算运行比较测试,我相信单一正则表达式解决方案在算法上更好,但我的答案更好。你应该创建自己的答案,或者编辑Haken的答案并展开,然后接受
import re

path="we_are_1.a_law_ab1ding_2.\path.yep.mhmmm_3 .nothing_to_s33_here_4"
dot_mask=re.compile(r'(\\[A-Za-z_|]+)\.(?=[^\s]*\s)')
masked_path=path
while( re.search(dot_mask,masked_path) != None):
  masked_path=re.sub(dot_mask,r'\g<1>||',masked_path)

masked_identifiers=masked_path.split('.')

unmask=re.compile(r'\|{2}')
unmasked_identifiers = []
for i in range(0,len(masked_identifiers)):
  unmasked_identifiers.append(re.sub(unmask,'.',masked_identifiers[i]))