我正在尝试在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将文件数据作为字符串。
但是这个正则表达式甚至匹配注释(带//行)。 如何避免匹配注释行。
答案 0 :(得分:2)
尝试:
r"(?m)^(?!//)static\s+const\s+PropertyID\s+(\S+)\s+=\s+(\d+);"
几个笔记。
^匹配行的开头
(?!//)是一个负向前瞻,声称它后面没有//
\ s是任何空格字符
\ S是任何非空格字符
答案 1 :(得分:1)
你可以指定,在行开头之后,你只需要在第一个static
之前的空格:
tuples = re.findall(r"^\s*static[ \t]*const[ \t]*PropertyID[ \t]*(\w+)[ \t]*=[ \t]*(\d+).*",fileContents)
答案 2 :(得分:0)
如果您正在解析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