2010-07-13 8 views

Respuesta

3

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 

Editar:

para manejar el caso en el que el patrón se encuentra, como se ha señalado por ΤΖΩΤΖΙΟΥ:

>>> 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 
+0

Las soluciones de r? Find son defectuosas en el caso en que la cadena de entrada no tiene el patrón; en este caso, el carácter "/". 's =" sin barra aquí "; imprima s [: s.find ("/")], s [: s.rfind ("/")]. Si arreglas esto, felizmente eliminaré mi voto downvote. – tzot

+0

@ ΤΖΩΤΖΙΟΥ: He actualizado mi respuesta. –

2
${name##*/} 

es equivalente a:

re.match(".*?([^/]*)$")[1] 

${name%/*} 

es equivalente a:

re.match("(.*?)[^/]*$")[1] 
2

No hay ninguna condición especial de "tira a la izquierda", "tira a la derecha ", etc. El método general es re.sub - por ejemplo mple, a "pelar todo hasta la última barra incluido" ("a la izquierda", como ksh conceptualiza):

name = re.sub(r'(.*/)(.*)', r'\2', name) 

ya las tiras "de la última barra y todo lo siguiente" ("a la derecha" por ksh):

name = re.sub(r'(.*)/.*', r'\1', name) 

Éstos hacen juego tanto como sea posible debido a que el * en los patrones de RE es codicioso; en su lugar, use *? para la concordancia no codiciosa ("lo menos posible").

1
>>> 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' 

Pero si su intención es utilizarlo con caminos, comprobar si las funciones os.path.dirname (${name%/*}) y os.path.basename (${name##*/}) tienen la funcionalidad que necesite.

Cuestiones relacionadas