Как можно разделить левые части и правильные части от строк до выражения соответствия как в ksh?
Например:
${name##*/}
${name%/*}
(см. http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html для ksh примеров).
Я, может казаться, не выясняю простой способ сделать этот модуль ре использования или строковый модуль, но я должен пропускать что-то.
Ksh:
$ s='abc/def/ghi'
$ echo ${s%%/*}
abc
$ echo ${s%/*}
abc/def
$ echo ${s#*/}
def/ghi
$ echo ${s##*/}
ghi
Python:
>>> s='abc/def/ghi'
>>> print s[:s.find("/")]
abc
>>> print s[:s.rfind("/")]
abc/def
>>> print s[s.find("/")+1:]
def/ghi
>>> print s[s.rfind("/")+1:]
ghi
Edit:
Для обработки случая, когда шаблон отсутствует, как указывает ΤΖΩΤΖΙΟΥ:
>>> s='abc/def/ghi'
>>> t='no slash here'
>>> print s[:s.find("/") % (len(s) + 1)]
abc
>>> print t[:t.find("/") % (len(t) + 1)]
no slash here
>>> print s[:s.rfind("/") % (len(s) + 1)]
abc/def
>>> print t[:t.rfind("/") % (len(t) + 1)]
no slash here
>>> print s[s.find("/")+1:]
def/ghi
>>> print t[t.find("/")+1:]
no slash here
>>> print s[s.rfind("/")+1:]
ghi
>>> print t[t.rfind("/")+1:]
no slash here
>>> def strip_upto_max(astring, pattern):
"${astring##*pattern}"
return astring.rpartition(pattern)[2]
>>> def strip_from_max(astring, pattern):
"${astring%%pattern*}"
return astring.partition(pattern)[0]
>>> def strip_upto(astring, pattern):
"${astring#*pattern}"
return astring.partition(pattern)[2]
>>> def strip_from(astring, pattern):
"${astring%pattern*}"
return astring.rpartition(pattern)[0]
>>> strip_from("hello there", " t")
'hello'
>>> strip_upto("hello there", " t")
'here'
>>> text= "left/middle/right"
>>> strip_from(text, "/")
'left/middle'
>>> strip_upto(text, "/")
'middle/right'
>>> strip_upto_max(text, "/")
'right'
>>> strip_from_max(text, "/")
'left'
Но если вы намерены использовать его с путями, проверьте, есть ли os.path.dirname
( $ {name% / *}
) и os.path.basename
( $ {name ## * /}
) функции имеют необходимые вам функции.
${name##*/}
Эквивалентно:
re.match(".*?([^/]*)$")[1]
${name%/*}
Эквивалентно:
re.match("(.*?)[^/]*$")[1]
Нет специального статуса для «полоса слева», «полоса вправо» и т. Д. Один общий метод - re.sub
- например, чтобы «разделить все до последняя косая черта включала "(" слева ", как это понимает ksh):
name = re.sub(r'(.*/)(.*)', r'\2', name)
и убирать" последнюю косую черту и все последующее "(" справа "на ksh):
name = re.sub(r'(.*)/.*', r'\1', name)
Они совпадают в максимально возможной степени потому что *
в шаблонах RE является жадным; вместо этого используйте *?
для нежадного сопоставления («как можно меньше»).