Проверка, начинается ли строка с XXXX
Я хотел бы узнать, как проверить, начинается ли строка с "hello" в Python.
В Bash я обычно делаю это следующим образом:
if [[ "$string" =~ ^hello ]]; then
# делаю что-то здесь
fi
Как мне достичь того же результата в Python?
3 ответ(ов)
Да, это также можно сделать следующим образом:
regex = re.compile('^hello')
# Этим способом вы можете проверять несколько строк,
# например:
# regex = re.compile('^hello|^john|^world')
if re.match(regex, somestring):
print("Да")
Таким образом, вы можете составить регулярное выражение, чтобы проверять несколько строк на соответствие, используя оператор |
для разделения вариантов.
Этот вопрос о том, какой из методов проверки, начинается ли строка с другой строки, наиболее эффективен. Я провел небольшое исследование, протестировав четыре метода:
string.startswith('hello')
string.rfind('hello') == 0
string.rpartition('hello')[0] == ''
string.rindex('hello') == 0
Результаты моего эксперимента, который я провел на 5 миллионах вызовов каждого из этих методов, показали интересные данные о времени выполнения. Вот примеры результатов из нескольких запусков тестов, где наименьшее время выполнено в секундах:
['startswith: 1.37', 'rpartition: 1.38', 'rfind: 1.62', 'rindex: 1.62']
['startswith: 1.28', 'rpartition: 1.44', 'rindex: 1.67', 'rfind: 1.68']
...
Как видно из результатов, метод startswith
consistently показал наилучшие результаты, что неудивительно, поскольку его основное назначение – проверять, начинается ли строка с указанного префикса.
Однако, что меня удивило, так это то, что метод string.rpartition('hello')[0] == ''
иногда занимает первое место, опережая string.startswith('hello')
. Это дает понять, что в некоторых случаях использование rpartition
для определения, начинается ли строка с другой строки, оказывается более быстрым, чем методы rfind
и rindex
.
Кроме того, методы rfind
и rindex
ведут между собой постоянную борьбу, меняя свои позиции с третьего на четвертое и обратно. Это вполне логично, так как их основная цель одна и та же.
Вот код, который я использовал для тестирования:
from time import perf_counter
string = 'hello world'
places = dict()
while True:
start = perf_counter()
for _ in range(5000000):
string.startswith('hello')
end = perf_counter()
places['startswith'] = round(end - start, 2)
start = perf_counter()
for _ in range(5000000):
string.rfind('hello') == 0
end = perf_counter()
places['rfind'] = round(end - start, 2)
start = perf_counter()
for _ in range(5000000):
string.rpartition('hello')[0] == ''
end = perf_counter()
places['rpartition'] = round(end - start, 2)
start = perf_counter()
for _ in range(5000000):
string.rindex('hello') == 0
end = perf_counter()
places['rindex'] = round(end - start, 2)
print([f'{b}: {str(a).ljust(4, "4")}' for a, b in sorted(i[::-1] for i in places.items())])
В итоге, если вам нужна наилучшее время выполнения при проверке, начинается ли строка с другого префикса, string.startswith
будет вашим оптимальным выбором, но не забывайте о rpartition
, который порой тоже может оказаться весьма эффективным.
В Python строки действительно ведут себя как списки, поэтому вы можете сделать следующее:
astring = "hello world"
astring[:5] == 'hello'
В этом примере срез astring[:5]
возвращает первые пять символов строки astring
, что соответствует строке 'hello'
.
Есть ли в Python метод подстроки 'contains' для строк?
Объединение двух столбцов текста в DataFrame pandas
Вывод строки в текстовый файл
Преобразование всех строк в списке в целые числа
Как извлечь числа из строки в Python?