Строка влево и вправо в стиле ksh, совпадающая с выражением? - PullRequest
5 голосов
/ 13 июля 2010

Как можно вырезать левые и правые части из строк до соответствующего выражения, как в ksh?

Например:

${name##*/}

${name%/*}

(см. http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html для примеров ksh).

Кажется, я не могу найти простой способ сделать это, используя модуль re или string, но я должен что-то упустить.

Ответы [ 4 ]

3 голосов
/ 13 июля 2010

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

Редактировать:

Чтобы обработать случай, в котором шаблон отсутствует,как указано ΤΖΩΤΖΙΟΥ :

>>> 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
2 голосов
/ 13 июля 2010

Не существует специального статуса для «полосы слева», «полосы справа» и т. Д. Один общий метод - re.sub - например, «удалить все до последней включенной косой черты» («влево», как это понимает ksh):

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

и убрать «последнюю косую черту и все последующие» («вправо» на ksh):

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

Они максимально соответствуют друг другу, потому что * в шаблонах RE жадные;вместо этого используйте *? для не жадного сопоставления («как можно меньше»).

2 голосов
/ 13 июля 2010
${name##*/}

Эквивалентно:

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

${name%/*}

Эквивалентно:

re.match("(.*?)[^/]*$")[1]
1 голос
/ 14 июля 2010
>>> 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##*/}) вам требуется.

...