RegEx忽略注释行。

2024-09-29 19:24:54 发布

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

我试图分析以下文本

# ---------------------------------------------------------------------------- #
# 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"]

使用正则表达式:

^{pr2}$

这也很好,给了我上面文本中所有的文件名,但是它也给了我被注释掉的行的文件名。在

我试着做一个正则表达式,忽略这一点,但我不能让它工作。在

这就是我试过的

(?<!#)(?:(?<=_FILE).+"(.+)")

请看一下RegEx 101

问候 以法莲


Tags: pathnametest文本globalfilevhdljoin
3条回答

似乎目标行的格式始终相同,可以使用字段方法避免正则表达式:

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])

如果您想坚持使用正则表达式,只需添加another lookahead

(?=.*_FILE)(?!^#)[^"]*"([^"]*)"


Python中,这相当简单: ^{pr2}$


a demo on ideone.com

若要忽略注释行,必须从行的开头开始匹配,并匹配除#之外的任何内容:

^[^#\n]*(?:(?<=_FILE).+"(.+)")

或者只是

^{pr2}$

两种模式都需要多行标志m。在

相关问题 更多 >

    热门问题