Pythonはこのような短い形式の構文でマルチサブパスを持つパスを生成できますか?
vars=project/{DEBIAN,usr/{bin,usr/{applications,icons,share}},computer}
通常、私は次のようなものを使用することを提案したでしょう
def extend(base, *others):
[base + o for o in others] if others else [base]
そしてします
extend("project", "/debian", *extend("/usr", *(extend("/bin") + extend("/usr", "/applications", "/icons", "/share"))))
。しかし、文字列の解析を好むので、私は別の方法を提供しようとします。
def commasplit(s):
start = 0
level = 0
for i, c in enumerate(s):
if c == '{':
level += 1
elif c == '}':
level -= 1
elif c == ',' and level == 0:
yield s[start:i]
start = i+1
yield s[start:]
def split(s):
import re
found = False
for m in re.finditer("(\{.*\})",s):
found = True
for p in commasplit(s[m.start() + 1:m.end() - 1]):
for i in split(p):
yield s[:m.start()] + i + s[m.end():]
if not found:
yield s
cs = "a,b,c,{d,e,f},g"
print list(commasplit(cs)) # -> seems to work
s = "project/{DEBIAN,usr/{bin,usr/{applications,icons,share}},computer}"
print s
for n, i in enumerate(split(s)): print n, i # -> as well.
いいえ、そのような組み込みの速記はありません。合理的にpythonicな方法は次のようになります:
vars = ["project" + path for path in (
["/DEBIAN"] +
["/usr" + path for path in (
['/bin'] +
['/usr' + path for path in [
"/applications",
"/icons",
"/share"]
]
)] +
['/computer']
)]
これを簡単にする関数を定義できます。レイジージェネレータバージョンは次のとおりです。
def expand(base, paths):
for path in paths:
if type(path) == str:
yield base + path
else:
for p in path:
yield base + p
vars = expand("project", [
"/debian",
expand("/usr", [
"/bin",
expand("/usr", [
"/applications",
"/icons",
"/share"
]),
"/computer"
])
])
ありがとうございました。
私は自分のコードを書こうとしています。
私はいつも["0,1,2,3,4,5,6,7,8,9".split( "、")、["a、b、c、d、e" .split( "、 ")]]通常のリストの代わりに。
なぜなら、シフトプレスなしで、明らかに、["x"、 "y"、"z"]よりも高速だからです。
だから、私はいくつかの文字列メソッドがコードの下で、Pythonでbashのように動作できるようになることを願っています...
Python構文:project、[DEBIAN、usr、[bin、usr、[applications、icons、share / winpath]]、computer]
Bash構文:project / {DEBIAN、usr / {bin、usr / {applications、icons、share}}、computer}
import re
def genpaths (multils, root=""):
suc=[]
for l in multils:
if type(l) == type([]):
suc.extend(genpaths (l, root+multils[multils.index(l)-1]+"/"))
else:
suc.append( root+l)
return filter(None, suc)
def easylist (s):
s=eval("['''"+re.sub("(\]+)(''',''')?", "'''\\1,'''",re.sub("(''',''')?(\[+)","''',\\2'''",re.sub(",","''','''",s)))+"''']")
return s
def bashlist (s):
s=eval("['''"+re.sub("(\}+)(''',''')?", "'''\\1,'''",re.sub("(/)?(\{+)","''',\\2'''",re.sub(",","''','''",s))).replace("{","[").replace("}","]")+"''']")
return s
def pythonGenPath (s):
return genpaths(bashlist (s))
def bashGenPath (s):
return genpaths(bashlist (s))
#testing
print pythonGenPath ("project,[DEBIAN,usr,[bin,usr,[applications,icons,share/winpath]],computer]")
print bashGenPath ("project/{DEBIAN,usr/{bin,usr/{applications,icons,share}},computer}")
結果は:
['project', 'project/DEBIAN', 'project/usr', 'project/usr/bin', 'project/usr/usr', 'project/usr/usr/applications', 'project/usr/usr/icons', 'project/usr/usr/share', 'project/computer']