Я использую 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)
Есть ли способ, чтобы найти первый хэш не в кавычках, не для петель
Примеры:
' "Phone #":"555-1234" ' -> ' "Phone #":"555-1234" '
' "Phone "#:"555-1234" ' -> ' "Phone "'
'#"Phone #":"555-1234" ' -> ''
' "Phone #":"555-1234" #Comment' -> ' "Phone #":"555-1234" '
Edit: Вот чисто регулярное решение, созданное 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, что я изменил для учета символов экранировать (\ ") Этот код также устраняет„если“, включив чек на конец строки ($):
filelines = []
r = re.compile(r'(?:"(?:[^"\\]|\\.)*"|[^"#])*(#|$)')
for line in f:
m = r.match(line)
filelines.append(line[:m.start(1)])
Это действительно умно, я знал, что это возможно с чем-то подобным, я просто не знал, как это сделать. Спасибо, работал как шарм. – RPGillespie
На одной линии для легкой копии макарон: re.search (r '(?: "[^"] * "| [^" #]) * (#)', Your_string) – Yourpalal