5

Проверка, начинается ли строка с XXXX

12

Я хотел бы узнать, как проверить, начинается ли строка с "hello" в Python.

В Bash я обычно делаю это следующим образом:

if [[ "$string" =~ ^hello ]]; then
    # делаю что-то здесь
fi

Как мне достичь того же результата в Python?

3 ответ(ов)

0

Да, это также можно сделать следующим образом:

regex = re.compile('^hello')

# Этим способом вы можете проверять несколько строк,
# например:
# regex = re.compile('^hello|^john|^world')

if re.match(regex, somestring):
    print("Да")

Таким образом, вы можете составить регулярное выражение, чтобы проверять несколько строк на соответствие, используя оператор | для разделения вариантов.

0

Этот вопрос о том, какой из методов проверки, начинается ли строка с другой строки, наиболее эффективен. Я провел небольшое исследование, протестировав четыре метода:

  • 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, который порой тоже может оказаться весьма эффективным.

0

В Python строки действительно ведут себя как списки, поэтому вы можете сделать следующее:

astring = "hello world"
astring[:5] == 'hello'

В этом примере срез astring[:5] возвращает первые пять символов строки astring, что соответствует строке 'hello'.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь