RegEx忽略注释行。

时间:2016-08-19 11:20:28

标签: python regex python-3.x

我正在尝试解析以下文本

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

使用正则表达式:

(?<=_FILE).*"(.+)"

这也工作正常,并给我上面文本中的所有文件名,但它也给了我已注释掉的行的文件名。

我试图制作一个会忽略它的RegEx但是我无法让它工作。

这就是我试过的

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

请查看RegEx 101

此致 Ephreal

4 个答案:

答案 0 :(得分:2)

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

即可
(?=.*_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']

<小时/> 请参阅a demo on ideone.com

答案 1 :(得分:1)

要忽略注释行,您必须在行的开头匹配并匹配#以外的任何内容:

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

或者只是

^[^#\n]*_FILE.+"(.+)"

两种模式都需要多行标记m

答案 2 :(得分:0)

您所定位的行似乎总是具有相同的格式,您可以使用字段方法来避免正则表达式:

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

答案 3 :(得分:0)

如果逐行解析:

^\w.+"(.+)".$ -> 在捕获组 1 中获取您的文件名

RegExr Playground

编辑:也许您需要在您的语言中转义“(如”)。