Перейти к содержанию

2.5. Алгоритмы на строках

Отфильтровать из строки числа

Задание:
Вводится строка, содержащая буквы, целые неотрицательные числа и иные символы. Требуется все числа, которые встречаются в строке, поместить в отдельный целочисленный массив. Например, если дана строка "data 48 call 9 read13 blank0a", то в массиве должны оказаться числа 48, 9, 13 и 0.

Подсказка

Если очередной символ строки оказывается цифрой (принадлежит диапазону от '0' до '9'), то его надо добавить в отдельную изначально пустую строку. Проверяя последующие после него символы на принадлежность тому же диапазону, добавлять их в конец той же строки. Это следует делать до тех пор, пока очередной символ окажется не цифрой. В этом случае надо сформированную до этого строку из цифр преобразовать в число и добавить в целочисленный массив. Саму же строку "очистить", т.е. присвоить пустую строку.

Пример решения:

s = "3 432 kdj3"
l = len(s)
integ = []
i = 0
while i < l:
    s_int = ''
    a = s[i]
    while '0' <= a <= '9':
        s_int += a
        i += 1
        if i < l:
            a = s[i]
        else:
            break
    i += 1
    if s_int != '':
        integ.append(int(s_int))

print(integ)

Вывод: [3, 432, 3]

Удаление лишних пробелов

Вводится ненормированная строка, у которой могут быть пробелы в начале, в конце и между словами более одного пробела. Привести ее к нормированному виду, т.е. удалить все пробелы в начале и конце, а между словами оставить только один пробел.

Подсказка

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

Пример решения:

s = '    ты что       делаешь    сейчас    '
i = 0
while s[i] == ' ':
    s = s[1:]
while s[len(s)-1] == ' ':
    s = s[:-1]
i = 1
while i < len(s)-1:
    if s[i] == ' ' and s[i+1] == ' ':
        s = s[:i+1] + s[i+2:]
    else:
        i += 1
print(s)

Результат: ты что делаешь сейчас

Является ли строка идентификатором

Определить, является ли введенное слово идентификатором, т.е. начинается ли оно с английской буквы в любом регистре или знака подчеркивания и не содержит других символов, кроме букв английского алфавита (в любом регистре), цифр и знака подчеркивания.

Подсказка

При решении задачи следует проверить:

  • Принадлежит ли первый символ слова множеству английских букв, или является символом подчеркивания?
  • Принадлежат ли все остальные символы слова множеству английских букв или множеству символов цифр или являются символами подчеркивания?

Если хотя бы один символ не принадлежит указанным множествам, то делается вывод, что слово идентификатором не является. При этом дальнейшую проверку символов можно опустить.

Пример решения:

s = 'max array'
if 'a' <= s[0].lower() <= 'z' or s[0] == '_':
    for i in range(1,len(s)):
        if not('a' <= s[i].lower() <= 'z' \
            or '0' <= s[i].lower() <= '9' \
            or s[i].lower() == '_'):
            print('No')
            quit()
    print('Yes')
else:
    print('No')

Как и ожидалось - результат No.

Попробуйте теперь самостоятельно выполнить некоторые задачи