python模式匹配将正则表达式组分配给类成员
我试图通过定义一个带有与成员变量对应的命名组的正则表达式,将数据流解析为一个类python模式匹配将正则表达式组分配给类成员,python,regex,variable-assignment,Python,Regex,Variable Assignment,我试图通过定义一个带有与成员变量对应的命名组的正则表达式,将数据流解析为一个类 进口稀土 ##------------------------------------------------------------------------------------------------- pattern=“”^(?P\w{4})(?P\w{4})(?P\w{4})” ##-----------------------------------------------------------
进口稀土
##-------------------------------------------------------------------------------------------------
pattern=“”^(?P\w{4})(?P\w{4})(?P\w{4})”
##-------------------------------------------------------------------------------------------------
类别数据:
定义初始化(自):
self.A=0##4字节
self.B=0##4字节
self.C=0##4字节
def显示(自我):
打印(“数据:”)
打印(“---------------------------------------”)
members=[attr for attr in dir(self)如果不可调用(getattr(self,attr)),则为attr,而不是attr.startswith(“_;”)]
对于成员中的成员:
打印(“%s:%s”%(成员,getattr(自身,成员)))
##-------------------------------------------------------------------------------------------------
hex_stream=“0000111beef”
##-------------------------------------------------------------------------------------------------
SearchObj=re.search(模式,十六进制流,re.I)
如果搜索对象:
D=数据()
members=[attr for attr in dir(D)如果不可调用(getattr(D,attr)),而不是attr.startswith(“_u;”)]
对于成员中的成员:
grp\u name=“\'”+成员+“\'”
打印(grp\U名称)
setattr(D,成员,内部(搜索对象组(grp_名称),16))
val=getattr(D,成员)
打印(“%s:%s”%(val,成员))
上面提到当grp_名称打印为“A”时,setattr()行上没有“这样的组”。语法上哪里出错了?我将更改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以确定需要设置的属性。如果稍后向类中添加不可调用的成员,会发生什么情况?它会变得非常混乱。这也很难理解。因为正则表达式匹配告诉您它知道哪些属性,所以您应该只设置这些属性。您可以使用
for member in members:
循环组,这意味着在每次迭代中,member
包含组名
然后,通过将
grp_name
嵌入“
”中,从成员创建grp_name
,这就是问题所在。组名不是grp\u name
,而是'A'
,它不是现有的组名。不添加'
s将解决问题。为什么要将'
s添加到成员?组名是A
,而不是'A'
。似乎我以前在没有单引号时犯了一些其他错误,并添加了单引号以试图解决问题。删除报价添加项似乎可以解决问题。非常感谢。
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)