首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx忽略注释行。

RegEx忽略注释行。
EN

Stack Overflow用户
提问于 2016-08-19 11:20:28
回答 4查看 7.2K关注 0票数 1

我正试图解析以下文本

代码语言:javascript
复制
# ---------------------------------------------------------------------------- #
# 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:

代码语言:javascript
复制
(?<=_FILE).*"(.+)"

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

我试着做了一个RegEx,它会忽略这一点,但是我无法让它工作。

这就是我试过的

代码语言:javascript
复制
(?<!#)(?:(?<=_FILE).+"(.+)")

请看一下RegEx 101

问候以弗莱

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-19 11:26:25

若要忽略注释行,必须在行开始时开始匹配,并匹配除#以外的任何内容。

代码语言:javascript
复制
^[^#\n]*(?:(?<=_FILE).+"(.+)")

或者只是

代码语言:javascript
复制
^[^#\n]*_FILE.+"(.+)"

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

票数 5
EN

Stack Overflow用户

发布于 2016-08-19 12:58:58

如果您想继续使用正则表达式,只需添加另一种展望

代码语言:javascript
复制
(?=.*_FILE)(?!^#)[^"]*"([^"]*)"

Python中,这非常简单:

代码语言:javascript
复制
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的演示

票数 2
EN

Stack Overflow用户

发布于 2016-08-19 11:41:32

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

代码语言:javascript
复制
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])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39037782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档