我正在使用 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/