[英]Given a Python string describing object.attribute, how do I separate the attributes's namespace from the attribute?
给定一个描述object.attribute的Python字符串,如何将属性的名称空间与属性分开?
所需示例:
ns_attr_split("obj.attr") => ("obj", "attr")
ns_attr_split("obj.arr[0]") => ("obj", "arr[0]")
ns_attr_split("obj.dict['key']") => ("obj", "dict['key']")
ns_attr_split("mod.obj.attr") => ("mod.obj", "attr")
ns_attr_split("obj.dict['key.word']") => ("obj", "dict['key.word']")
注意:我知道编写自己的字符串解析器是一种选择,但是我正在寻找一种更优雅的解决方案。 滚动我自己的字符串解析器并不像在'。'上拆分一样简单。 由于上面列出的最后一个选项,其中给定关键字可能包含名称空间定界符。
我最近发现了用于标记化python源代码的标记化库。 使用此库,我得出了以下小代码段:
import tokenize
import StringIO
def ns_attr_split(s):
arr = []
last_delim = -1
cnt = 0
# Tokenize the expression, tracking the last namespace
# delimiter index in last_delim
str_io = StringIO.StringIO(s)
for i in tokenize.generate_tokens(str_io.readline):
arr.append(i[1])
if i[1] == '.':
last_delim = cnt
cnt = cnt + 1
# Join the namespace parts into a string
ns = ""
for i in range(0,last_delim):
ns = ns + arr[i]
# Join the attr parts into a string
attr = ""
for i in range(last_delim + 1, len(arr)):
attr = attr + arr[i]
return (ns, attr)
这也应与中间索引/键一起使用。 (即“ mod.ns [3] .obj.dict ['key']“)
假设命名空间始终是字母数字,你可以先拆对/[^a-zA-Z.]/
,然后rsplit
上.
:
>>> import re
>>> ns_attr_split = lambda s: re.split("[^a-zA-Z.]", s, 1)[0].rsplit('.')
>>> ns_attr_split("obj.dict['key.word']")
['obj', 'dict']
显然,这不是正是你想要的......但小提琴演奏会直截了当。
一个有趣的小正则表达式问题...
此代码适用于您使用Python 2.6提供的所有示例,并假定您没有任何中间索引/键访问(例如“ obj ['foo']。baz”):
import re
ns_attr_split = lambda s: re.match(r"((?:\w+\.)*\w+)\.(.+)", s).groups()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.