Написание регулярного выражения для пропуска строки при наличии определенного набора символов?

#python #regex

#python #регулярное выражение

Вопрос:

Я пытаюсь написать регулярное выражение на python для анализа файла с таким содержимым :-

 static const PropertyID PROPERTY_X = 10225;
//static const PropertyID PROPERTY_Y = 10226;
   //static const PropertyID PROPERTY_Z = 10227;
  

Я хочу извлечь имя и номер свойства только для некомментируемых свойств.
Это выражение, которое я написал

 tuples = re.findall(r"[^/]*static[ t]*const[ t]*PropertyID[ t]*(w )[ t]*=[ t]*(d ).*",fileContents)
  

где FileContents содержит данные файла в виде строки.

Но это регулярное выражение даже сопоставляет закомментированные (строки с //) строками. Как сделать так, чтобы он не совпадал с закомментированными строками.

Комментарии:

1. Зачем для этого использовать регулярные выражения? Мой обычный подход к этому — «для строки в open(filename): line = line.split(‘//’)[0]» за этим следует фактическая обработка строки.

Ответ №1:

Попробуйте:

 r"(?m)^(?!//)statics consts PropertyIDs (S )s =s (d );"
  

Пара замечаний.

^ соответствует началу строки

(?!//) является отрицательным прогнозом, утверждающим, что за ним НЕ следует //

s — любой символ пробела

S — любой символ, не являющийся пробелом

Ответ №2:

Вы могли бы указать, что после начала строки вам нужны только пробелы перед первым static :

 tuples = re.findall(r"^s*static[ t]*const[ t]*PropertyID[ t]*(w )[ t]*=[ t]*(d ).*",fileContents)
  

Комментарии:

1. Я оставил ваше регулярное выражение практически нетронутым, но оно могло бы быть более кратким.

Ответ №3:

Если вы анализируете код на C, вы можете использовать что-то вроде pycparser. Регулярные выражения не подходят (или не возможны) для анализа любого языка программирования.

В качестве альтернативы, я думаю, что этот код проще для того, что вы делаете:

 import re
string = "   //static const PropertyID PROPERTY_Z = 10227;"
results = re.split("s*",string)
#results = ['//static', 'const', 'PropertyID', 'PROPERTY_Z', '=', '10227;']

if results[0].startswith("\") or results[0].startswith("/*"):
    pass