Найти - Пользователи
Полная версия: Регулярное выражение, вернуть последнее совпадение.
Начало » Python для новичков » Регулярное выражение, вернуть последнее совпадение.
1 2 3
Nata
>>> reg1 = re.compile(r'[^/]*$')
>>> reg2 = re.compile(r'.*/(.+)')
>>>
>>> class my_string(str):
...     def slash_split(self):
...             return self.split("/")
... 
>>> path=my_string('/home/test/soft/print.sh')
>>>
>>> commands={"split":my_string.slash_split, "os.path.basename":os.path.basename, "reg1":reg1.search, "reg2":reg2.search}
>>>
>>> for cmd in commands:
	command = commands[cmd]
...     start_time = time.time()
...     for i in range(1000000):
...             f=command(path)
...     print("%s took %f seconds" % (cmd, time.time() - start_time))
... 
os.path.basename took 0.624602 seconds
reg2 took 0.748091 seconds
split took 0.858206 seconds
reg1 took 2.544495 seconds
>>>

os.path.basename всех победил! :D :D
Nata
ой, нет, извиняюсь, в чистом виде split быстрее basename
start_time = time.time()
for i in range(1000000):
        f='/home/test/soft/print.sh'.split('/')[-1]
print("split took %f seconds" % (time.time()-start_time))
start_time = time.time()
for i in range(1000000):
        f=os.path.basename('/home/test/soft/print.sh')
print("basename took %f seconds" % (time.time()-start_time))

nata@mycomp:~$ ./check.py
split took 0.652838 seconds
basename took 0.716145 seconds

split всех победил! :D :D
dimy44
А почему не rsplit('/', 1) ?
bs0d
Nata
<— плюс там
Nata
dimy44
А почему не rsplit('/', 1) ?
добавила rsplit
f='/home/test/soft/print.sh'.rsplit('/')[-1]
nata@mycomp:~$ ./check.py
split took 0.674300 seconds
rsplit took 0.777677 seconds
basename took 0.708357 seconds

:D
dimy44
Я имел в виду, что в rsplit нужно передать количество разбиений вторым параметром, в данном случае 1
Nata

так?
f='/home/test/soft/print.sh'.rsplit('/', 1)[-1]
nata@mycomp:~$ ./check.py
split took 0.670396 seconds
rsplit took 0.606263 seconds
basename took 0.706765 seconds

не знала про этот параметр, спасибо :)
dimy44
Это всё хорошо, но врядли эти сотые доли имеют значение, все же с путями работает os.path, да и по большому счету разделитель не везде ‘/’, лучше юзать константу os.sep. И еще, если уж получается такая циклодробилка, то желательно перед циклом записать например os_path_basename = os.path.basename - сохранить в локальную переменную и юзать ее в цикле, ее поиск в пространстве имен будет производиться быстрее.
Nata
dimy44
Это всё хорошо, но врядли эти сотые доли имеют значение
мы просто выбирали чемпиона по скорости нахождения имени файла в path :D
мы не будем так писать в реальной жизни, ну если только нужда не заставит…
dimy44
os_path_basename = os.path.basename - сохранить в локальную переменную и юзать ее в цикле
dimy44
лучше юзать константу os.sep
100% agreed
py.user.next
[guest@localhost ~]$ python3 -mtimeit "import re; r = re.compile(r'.*/(.+)'); r.search('/home/test/soft/print.sh').group(1)"
100000 loops, best of 3: 3.79 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit "import re; re.search(r'[^/]*$', '/home/test/soft/print.sh').group()"
100000 loops, best of 3: 5.05 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit "import os; os.path.basename('/home/test/soft/print.sh')"
100000 loops, best of 3: 3.23 usec per loop
[guest@localhost ~]$

[guest@localhost ~]$ python3 -mtimeit "'/home/test/soft/print.sh'.rsplit('/', 1)[-1]"
1000000 loops, best of 3: 0.707 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit "'/home/test/soft/print.sh'.split('/')[-1]"
1000000 loops, best of 3: 0.755 usec per loop
[guest@localhost ~]$

Ну вот, мой получился самым медленным. А правильный .rsplit() - самым быстрым.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB