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