Как обрезать самое длинное совпадение с начала строки (используя python) - PullRequest
0 голосов
/ 21 октября 2009

В последних версиях bash я могу сделать это:

$ string="Universe.World.Country.State.City.Street"
$ echo $string
Universe.World.Country.State.City.Street
$ newString="${string##*.}"
$ echo $newString
Street

Используя Python, каков лаконичный способ сделать то же самое? Я заинтересован в последней подстроке после последнего периода.

Спасибо!

Ответы [ 6 ]

3 голосов
/ 22 октября 2009
>>> 'Universe.World.Country.State.City.Street'.rpartition('.')[2]
'Street'
3 голосов
/ 21 октября 2009

Как насчет

x[x.rfind('.') + 1 : ]

Для меня это выражает то, что вас интересует (найдите последнюю точку, затем возьмите все после нее) проще, чем шаблон или понятие "самого длинного совпадения".

1 голос
/ 22 октября 2009
>>> "Universe.World.Country.State.City.Street".rsplit('.',1)[1]
'Street'

Edit: rpartition, предложенный SilentGhost, представляется наиболее эффективным

# rpartition
$ python -m timeit -r100 -n100 -s 'x="Universe.World.Country.State.City.Street"' 'x.rpartition(".")[-1]'
100 loops, best of 100: 0.749 usec per loop

# rfind
$ python -m timeit -r100 -n100 -s 'x="Universe.World.Country.State.City.Street"' 'x[x.rfind(".")+1:]'
100 loops, best of 100: 0.808 usec per loop

# rsplit
$ python -m timeit -r100 -n100 -s 'x="Universe.World.Country.State.City.Street"' 'x.rsplit(".",1)[1]'
100 loops, best of 100: 0.858 usec per loop

# split
$ python -m timeit -r100 -n100 -s 'x="Universe.World.Country.State.City.Street"' 'x.split(".")[-1]'
100 loops, best of 100: 1.26 usec per loop

# regex
$ python -m timeit -r100 -n100 -s 'import re;rex=re.compile(r"\.([^.]*)$");x="Universe.World.Country.State.City.Street"' 'rex.search(x).groups()[0]'
100 loops, best of 100: 3.16 usec per loop
0 голосов
/ 05 июля 2011

string.rsplit('.', 1)[-1] с maxsplit = 1 возвращает только самый правый '.', Поэтому он также совпадает только один раз.

Похоже на жеребьевку с string.rpartition('.')[-1]

PS: gnibbler на самом деле рассчитал rsplit, и он был немного медленнее, чем rpartition, rfind.

0 голосов
/ 21 октября 2009

Если вы знаете, что он всегда будет последним элементом и полной остановкой, вы не сможете победить

"Universe.World.Country.State.City.Street".split(".")[-1]
0 голосов
/ 21 октября 2009

Может быть:

re.search(r"\.([^.]*)$", s).groups()[0]

РЕДАКТИРОВАТЬ: Первая версия была плохой :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...