我试图通过定义具有与成员变量对应的命名组的正则表达式来将数据流解析为类。
import re
##-------------------------------------------------------------------------------------------------
pattern = """^(?P<A>\w{4})(?P<B>\w{4})(?P<C>\w{4})"""
##-------------------------------------------------------------------------------------------------
class Data:
def __init__(self):
self.A = 0 ##4 bytes
self.B = 0 ##4 bytes
self.C = 0 ##4 bytes
def show(self):
print( "Data:" )
print( "------------------------------------" )
members = [attr for attr in dir(self) if not callable(getattr(self,attr)) and not attr.startswith("__")]
for member in members:
print("%s:%s" % (member, getattr(self, member)) )
##-------------------------------------------------------------------------------------------------
hex_stream = "00001111BEEF"
##-------------------------------------------------------------------------------------------------
SearchObj = re.search(pattern, hex_stream, re.I)
if SearchObj:
D = Data()
members = [attr for attr in dir(D) if not callable(getattr(D, attr)) and not attr.startswith("__")]
for member in members:
grp_name = "\'" +member + "\'"
print( grp_name )
setattr( D, member, int( SearchObj.group( grp_name ), 16 ) )
val = getattr( D, member )
print("%s:%s" % ( val, member ) )
以上抱怨有没有这样的团体&#34;当&#39; A&#39;在setattr()行上是为grp_name打印的。在语法上,我出错了吗?
答案 0 :(得分:0)
我会更改 init 方法以获取成员值,如下所示:
class Data:
def __init__(self, A, B, C):
self.A = A
self.B = B
self.C = C
然后,您可以像这样使用match.groupdict方法:
match = re.search(pattern, hex_stream, re.I)
if match:
# pmatch is a dict (grp_name -> grp_value)
pmatch = match.groupdict()
# we create a new dict by converting the grp_value to an int:
params={name: int(value,16) for (name,value) in pmatch.items()}
# then we just create D from those values.
D = Data(**params)
那你为什么要那样做?
您发布的实施检查对象D以确定需要设置的属性。如果您稍后将一个不可调用的成员添加到您的班级会发生什么?它会变得非常混乱。这也很难理解。由于你的正则表达式匹配告诉你它知道哪些属性,你应该只设置它们。
答案 1 :(得分:0)
使用for member in members:
循环遍历群组,这意味着在每次迭代中,member
都包含群组名称。
然后,您将grp_name
中的member
嵌入到'
中,这就是问题所在。 grp_name
不是A
,而是'A'
,而不是现有的组名。不添加'
将解决问题。