我正试图解析以下文本
# ---------------------------------------------------------------------------- #
# Packages
# ---------------------------------------------------------------------------- #
set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "file_1_test_1_qip.vhd"]
set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "file_2_test_1_qip.vhd"]
set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "file_3_test_1_qip.vhd"]
# Register Tool set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "file_INVALID_test_1_qip.vhd"]
# ---------------------------------------------------------------------------- #
# Sub Modules
# ---------------------------------------------------------------------------- #
set_global_assignment -name QIP_FILE [file join $::quartus(qip_path) "module_test_2.qip"]
set_global_assignment -name QIP_FILE [file join $::quartus(qip_path) "module_test_3.qip"]
# ---------------------------------------------------------------------------- #
# Module Files
# ---------------------------------------------------------------------------- #
set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "file_4_test_1_qip.vhd"]
set_global_assignment -name VHDL_FILE [file join $::quartus(qip_path) "file_5_test_1_qip.vhd"]使用regex:
(?<=_FILE).*"(.+)"这也很好,给出了上面文本中的所有文件名,但是它也给出了被注释掉的行的文件名。
我试着做了一个RegEx,它会忽略这一点,但是我无法让它工作。
这就是我试过的
(?<!#)(?:(?<=_FILE).+"(.+)")请看一下RegEx 101
问候以弗莱
发布于 2016-08-19 11:26:25
若要忽略注释行,必须在行开始时开始匹配,并匹配除#以外的任何内容。
^[^#\n]*(?:(?<=_FILE).+"(.+)")或者只是
^[^#\n]*_FILE.+"(.+)"这两种模式都需要多行标志m。
发布于 2016-08-19 12:58:58
如果您想继续使用正则表达式,只需添加另一种展望
(?=.*_FILE)(?!^#)[^"]*"([^"]*)"
在Python中,这非常简单:
import re
rx = re.compile(r'(?=.*_FILE)(?!^#)[^"]*"([^"]*)"', re.MULTILINE)
files = rx.findall(your_string_here)
print(files)
# ['file_1_test_1_qip.vhd', 'file_2_test_1_qip.vhd', 'file_3_test_1_qip.vhd', 'file_INVALID_test_1_qip.vhd', 'module_test_2.qip', 'module_test_3.qip', 'file_4_test_1_qip.vhd', 'file_5_test_1_qip.vhd']
见一个关于ideone.com的演示。
发布于 2016-08-19 11:41:32
似乎目标行的格式总是相同的,您可以使用字段方法来避免正则表达式:
def notcomm(fh):
for line in fh:
line = line.lstrip()
if line.startswith('#') or line == "":
continue
yield(line)
with open('yourfile.txt', 'r') as fh:
for line in notcomm(fh):
parts = line.split()
if parts[2].endswith('_FILE'):
print(parts[6][1:-2])https://stackoverflow.com/questions/39037782
复制相似问题