gpt4 book ai didi

Python-正则表达式解析文件

转载 作者:行者123 更新时间:2023-12-01 04:49:09 25 4
gpt4 key购买 nike

我有一个这样的文件

module modulename(wire1, wire2, \wire3[0], \wire3[1], \wire3[2], wire4, wire5,wire6, wire7, \wire8[0], wire9); nonmodule modulename(wire1, wire2, \wire3[0], \wire3[1], \wire3[2],  wire4, wire5,wire6, wire7, \wire8[0], wire9)

我想将此字符串更改为

    module modulename(wire1, wire2, wire3[0:2],wire4, wire5, wire6, wire7,wire8[0],wire9) ; nonmodule modulename(wire1, wire2, wire3[0], wire3[1], wire3[2], wire4, wire5,wire6, wire7, wire8[0], wire9)

所以基本上删除\并删除电线的各个副本,并将大小更改为 [start:stop] 当起始关键字是模块时,并且在“;”之后开始关键字时删除斜杠不是模块

如果我可以用正则表达式解析它,我可以完成剩下的工作,我正在尝试下面的代码,但它不匹配任何内容。代码修改自 - pattern to dictionary of lists Python

lines=f.read()

d = defaultdict(list)
module_pattern = r'(\w+)\s(\w+)\(([^;]+)'
mod_rex = re.compile(module_pattern)
wire_pattern = r'(\w+)\s[\\]?(\w+)['

wire_rex = re.compile(wire_pattern)

for match in mod_rex.finditer(lines):
#print '\n'.join(match.groups())
module, instance, wires = match.groups()
for match in wire_rex.finditer(wires):
wire, connection = match.groups()
#print '\t', wire, connection
d[wire].append((module, instance, connection))

for k, v in d.items():
print k, ':', v

感谢帮助,但无法识别 token 。

最佳答案

这应该可以帮助您入门。我不确定您可以对文件格式做出什么假设,但修改此代码以满足您的需求应该足够简单。

此外,我认为端口的顺序很严格,因此它们没有被修改。这也是我没有使用字典的原因。

此代码将删除所有反斜杠并将相邻位折叠为向量。这还将处理不从 0 开始的向量(例如 someport[3:8])。我还选择将单个位向量表示为 [0:0] 而不是 [0]

import re
import sys

mod_re = re.compile(r'module\s*([^(]+)\(([^)]*)\);(.*)')
wire_re = re.compile(r'([^[]+)\[([0-9]+)\]')

def process(line):
# Get rid of all backslashes. You can make this more selective if you want
clean = line.replace('\\', '')

m = mod_re.search(clean)
if m:
ports = []
mod_name, wires, remaining = m.groups()

for wire in wires.split(','):
wire = wire.replace(' ', '')

m = wire_re.search(wire)
if m:
# Found a vector
n = int(m.group(2))
prev_wire, _ = ports[-1]

# If previous port was a vector, tack on next value
if prev_wire == m.group(1):
ports[-1][1][1] = n
else:
ports.append((m.group(1), [n, n]))
else:
# Found a scalar
ports.append((wire, None))

# Stringify ports
out = []
for port in ports:
name, val = port
if val is None:
out.append(name)
else:
start, end = val
out.append('%s[%s:%s]' % (name, start, end))

print 'module %s(%s); %s' % (mod_name, ', '.join(out), remaining)


f = open(sys.argv[1], 'r')
if f:
for l in f.readlines():
process(l)
f.close()

输出:

module modulename(wire1, wire2, wire3[0:2], wire4, wire5, wire6, wire7, wire8[0:0], wire9);  nonmodule modulename(wire1, wire2, wire3[0], wire3[1], wire3[2],  wire4, wire5,wire6, wire7, wire8[0], wire9)

PS:我不知道你到底想做什么,但是更改模块定义也需要更改实例化。

编辑:打开文件以支持 Python2.5 时删除了 with 关键字。

关于Python-正则表达式解析文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28775464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com