#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