Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python模式匹配将正则表达式组分配给类成员_Python_Regex_Variable Assignment - Fatal编程技术网

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)