不删除引号内的哈希注释

2024-04-25 19:31:07 发布

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

我使用python遍历一个文件并删除所有注释。注释被定义为散列及其右边的任何内容,只要散列不在双引号内。我目前有一个解决方案,但似乎不太理想:

filelines = []
    r = re.compile('(".*?")')
    for line in f:
        m = r.split(line)
        nline = ''
        for token in m:
            if token.find('#') != -1 and token[0] != '"':
                nline += token[:token.find('#')]
                break
            else:
                nline += token
        filelines.append(nline)

有没有一种方法可以在没有for循环的引号内找到第一个散列(即通过正则表达式)在

示例:

^{pr2}$

编辑:这是一个由用户2357112创建的纯正则表达式解决方案。我测试过,效果很好:

filelines = []
r = re.compile('(?:"[^"]*"|[^"#])*(#)')
for line in f:
    m = r.match(line)
    if m != None:
        filelines.append(line[:m.start(1)])
    else:
        filelines.append(line)

关于这个regex是如何工作的,请参阅他的回复。在

编辑2:这是user2357112代码的一个版本,我修改了它来解释转义字符(\”)。此代码还通过包含对字符串结尾($)的检查来消除“if”:

filelines = []
r = re.compile(r'(?:"(?:[^"\\]|\\.)*"|[^"#])*(#|$)')
for line in f:
    m = r.match(line)
    filelines.append(line[:m.start(1)])

Tags: inretoken编辑forifmatchline
3条回答

可以使用以下脚本删除注释:

import re
print re.sub(r'("(?:[^"]+|(?<=\\)")*")|#[^\n]*', lambda m: m.group(1) or '', '"Phone #"#:"555-1234"')

这样做的目的是在搜索夏普之前用双引号捕获一个部分并替换它自己:

^{pr2}$

这个代码太难看了,我不得不贴出来。在

def remove_comments(text):
    char_list = list(text)
    in_str = False
    deleting = False
    for i, c in enumerate(char_list):
        if deleting:
            if c == '\n':
                deleting = False
            else:
                char_list[i] = None
        elif c == '"':
            in_str = not in_str
        elif c == '#':
            if not in_str:
                deleting = True
                char_list[i] = None
    char_list = filter(lambda x: x is not None, char_list)
    return ''.join(char_list)

不过似乎很管用。虽然我不确定它如何处理windows和linux之间的换行符。在

r'''(?:        # Non-capturing group
      "[^"]*"  # A quote, followed by not-quotes, followed by a quote
      |        # or
      [^"#]    # not a quote or a hash
    )          # end group
    *          # Match quoted strings and not-quote-not-hash characters until...
    (#)        # the comment begins!
'''

这是一个详细的regex,设计为在一行上操作,因此请确保使用re.VERBOSE标志,并一次输入一行。如果有组1,它将捕获第一个未加引号的哈希,因此您可以使用match.start(1)来获取索引。如果您希望能够将反斜杠转义引号放入字符串中,它不处理反斜杠转义。这是未经测试的。在

相关问题 更多 >