python - 删除不在引号内的散列注释

标签 python regex comments quotes strip

我正在使用 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 循环的情况下找到不在引号内的第一个散列(即通过正则表达式?)

例子:

' "Phone #":"555-1234" ' -> ' "Phone #":"555-1234" '
' "Phone "#:"555-1234" ' -> ' "Phone "'
'#"Phone #":"555-1234" ' -> ''
' "Phone #":"555-1234" #Comment' -> ' "Phone #":"555-1234" '

编辑:这是由 user2357112 创建的纯正则表达式解决方案。我测试了它,效果很好:

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)

有关此正则表达式如何工作的更多详细信息,请参阅他的回复。

Edit2:这是我修改的 user2357112 代码的一个版本,用于说明转义字符 (\")。此代码还通过检查字符串结尾 ($) 消除了“if”:

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

最佳答案

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!
'''

这是一个冗长的正则表达式,设计用于在单行上运行,因此请确保使用 re.VERBOSE 标志并一次输入一行。如果有的话,它会将第一个未加引号的散列捕获为第 1 组,因此您可以使用 match.start(1) 获取索引。如果您希望能够在字符串中放置反斜杠转义引号,它不处理反斜杠转义。这是未经测试的。

关于python - 删除不在引号内的散列注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17791143/

相关文章:

python - 更改python-pptx中部分文本的字体

python - 根据 DataFrame 中的字符串格式创建额外的行

python - 生成所有可能的 rgb 颜色

regex - 替换零并修剪空间regex模式似乎无法在Elasticsearch分析器中正常工作

python - pandas loc vs. iloc vs. at vs. iat?

javascript - 用于检查用户代理字符串中是否存在关键字的正则表达式

regex - 带有捕获组的 RegEx 中的空格问题

objective-c - doxygen 是否支持对 Objective-C 中的方法参数进行内联注释?

java - Eclipse:如何区分代码中的公共(public)注释和私有(private)注释?

arrays - 在 yaml 文件中,我可以在用连字符列出的数组项之间进行注释吗?