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

Python работа со строками

Присваивание значения

    a = 'text11'
    b = "text22"

    print(a)
    text11

    print(b)
    text22

Ввод длинных строк

    a = "line1\nline2\nline3"

    print(a)
    line1
    line2
    line3
    a = '''interface Vlan1
    description << Vlan1 >>
    ip address 192.168.0.254 255.255.255.0
    ip access-group 1 in
    ip access-group 2 out
    no ip redirects
    no ip unreachables
    no ip proxy-arp
    no ipv6 redirects
    no ipv6 unreachables
    counter ipv4 ipv6 separate
    end'''

    print (a)
    interface Vlan1
     description << Vlan1 >>
     ip address 192.168.0.254 255.255.255.0
     ip access-group 1 in
     ip access-group 2 out
     no ip redirects
     no ip unreachables
     no ip proxy-arp
     no ipv6 redirects
     no ipv6 unreachables
     counter ipv4 ipv6 separate
    end

Экранирование символов/спец. символы

    a = 'tes\'t'
    b = "tes't"

    print(a)
    tes't

    print(b)
    tes't
    a = "tes\"t"
    b = 'tes"t'

    print(a)
    tes"t

    print(b)
    tes"t

Обращение к элементам строки, срезы, шаг

К строке можно обрашаться по номеру элемента, делать срезы, устанавливать шаг

#Первоначальная строка
In [62]: a = "interface Vlan1"

#В python элементы строки начинается с 0
#последний элемент строки имеет индекс -1

#Вывод 0 элемента строки.
In [63]: print(a[0])
i

#Вывод 1 элемента строки.
In [64]: print(a[1])
n

#Вывод последнего элемента строки.
In [65]: print(a[-1])
1

#Вывод предпоследнего элемента строки.
In [66]: print(a[-2])
n

#Срезы строки
#Вывод среза строки с 0 по 9 элемент

In [67]: print(a[0:9])
interface

#Можно опускать начало и конец среза 
#тогда пустые значения будут означать 
#начало и конец строки соовтетственно

#Срез от начала строки дл 9 элемента
In [68]: print(a[:9])
interface

#Срез с 10 элемента до конца строки
In [69]: print(a[10:])
Vlan1

#Срез от 5 элемента с концадо конца строки
In [70]: print(a[-5:])
Vlan1

#Срез с начала строки до предпоследнего символа
In [71]: print(a[0:-1])
interface Vlan

#Срез с начала строки до конца строки
In [72]: print(a[:])
interface Vlan1

#Срез с начала строки до конца строки
In [73]: print(a[0:])
interface Vlan1


#Шаг  
#За основу работы с шагом возьмем срез  от начала строки до 9 элемента
In [74]: print(a[0:9])
interface

#Выбор из среза каждого второго элемента
In [75]: print(a[0:9:2])
itrae

#Выбор из среза каждого третьего элемента
In [76]: print(a[0:9:3])
iea

#При указании шага -1 
#Получаем перевернутую строку
In [77]: print(a[::-1])
1nalV ecafretni

Методы для работы со строками, функции

In [62]: a = "interface Vlan1"

#Вывести в верхнем регистре
In [85]: a.upper()
Out[85]: 'INTERFACE VLAN1'

#Вывести в нижнем регистре
In [86]: a.lower()
Out[86]: 'interface vlan1'

#Поменять регистры
In [87]: a.swapcase()
Out[87]: 'INTERFACE vLAN1'

#Вывести строку все с маленькой буквы, кроме первой
In [88]: a.capitalize()
Out[88]: 'Interface vlan1'

#Подсчет количества вхождений подстроки
# буквы 'e' (подстроки 'e')
In [96]: a.count('e')
Out[96]: 2

# подстроки 'int'
In [97]: a.count('int')
Out[97]: 0

# подстроки 'Int'
In [98]: a.count('Int')
Out[98]: 1


#Длина строки =15
In [106]: a = 'Interface vlan1'

#Метод count() возврашает на +1 больше 
In [107]: a.count('')
Out[107]: 16

#Функция len - точно
In [108]: len(a)
Out[108]: 15


#Поиск первого вхождения подстроки
In [109]: a.find('a')
Out[109]: 6
#Если сделаем срез с 6ого элемента, то как раз первый #элемент этого среза и будет символ 'a'
#Но второе вхождение никак не учитывается
In [110]: a[6:]
Out[110]: 'ace vlan1'

#Проверка с чего начинается, заканчивается строка
In [111]: a.startswith('I')
Out[111]: True

In [112]: a.startswith('i')
Out[112]: False

In [113]: a.endswith('vlan1')
Out[113]: True

In [114]: a.endswith('Vlan1')
Out[114]: False

#Замена части строки
In [115]: a.replace('vlan1','Vlan10')
Out[115]: 'Interface Vlan10'

Избавление от спец символов.

#Часто в выводе команд встречаются спец символы типа табуляций
#перехода на нову строку и пр...

In [121]:  a = '\t\tInterface vlan1\n\t'

In [122]: a
Out[122]: '\t\tInterface vlan1\n\t'

In [123]: print(a)
                Interface vlan1

#Чтобы избавиться от спец смволов

#strip() - удаление спец символов изо всей строки
In [127]: a.strip()
Out[127]: 'Interface vlan1'

#strip() - удаление спец символов только справа
In [128]: a.rstrip()
Out[128]: '\t\tInterface vlan1'

#strip() - удаление спец символов только слева
In [129]: a.lstrip()
Out[129]: 'Interface vlan1\n\t'


#strip - Может удалять символы справа и слева
#!но не может всередине

In [148]: a = '[110/80]'

In [149]: a
Out[149]: '[110/80]'

#Удаляем справа и слева символы []
In [150]: a.strip('[]')
Out[150]: '110/80'

#Аналогична пред. команде
#Удаляем справа и слева символы ][
In [151]: a.strip('][')
Out[151]: '110/80'

#Если символ в середине, то не получится
#Удаляем справа и слева символы /
In [152]: a.strip('/')
Out[152]: '[110/80]'

#А вот такая конструкция отработает нормально
#Удаляем справа и слева символы ]1[
In [153]: a.strip(']1[')
Out[153]: '0/80'

Получение из строки списка

#Получение из строки списка 
#по дефолту строкой разделителем является 
#силволы whitespace 
In [156]:  a = '\t\tInterface vlan1\n\t'

In [157]: a.split()
Out[157]: ['Interface', 'vlan1']

In [158]:  a = '\t\tInterface \t vlan1\n\t'

In [159]: a.split()
Out[159]: ['Interface', 'vlan1']


In [160]:  a = '1,2,3,4,5'

In [161]: a.split(',')
Out[161]: ['1', '2', '3', '4', '5']


#Можно в явном виде указывать разделительный символ 
In [160]:  a = '1,2,3,4,5'

#тогда при указании запятой в качестве разделителя 
#получим список такого вида
In [161]: a.split(',')
Out[161]: ['1', '2', '3', '4', '5']


#split() - дефолтовый умный  - он удвляет все символы whitespac-ов
In [169]: a = '\t\tInterface \t vlan1\n\t'

In [170]: print(a)
                Interface        vlan1


In [171]: a.split()
Out[171]: ['Interface', 'vlan1']

#В отличие от общего
In [172]: a.split(' ')
Out[172]: ['\t\tInterface', '\t', 'vlan1\n\t']

Форматирование строк

при помощи форматирования строк можно сделать шаблон и заполнять его согласно

#Например, при помощи форматирования строк 
#можно сделать шаблон для интер фейсов
#и заполнять его согласно списку интерфейсов

In [181]: intf_tmpl ='interface {}'

In [182]: intf_tmpl.format('g0/1')
Out[182]: 'interface g0/1'


In [183]: intf_tmpl.format('eth1/48')
Out[183]: 'interface eth1/48'


# можно использовать переменную напрямую
# при работе с format
In [185]: f = 'gi0/0'

In [186]: intf_tmpl.format(f)
Out[186]: 'interface gi0/0'

#По сути выполняется вот такая конструкуция
In [184]: 'interface {}'.format('eth1/48')
Out[184]: 'interface eth1/48'

Форматирование нескольких строк

# Создаем шаблон
In [202]: intf_tmpl = "{}{}{}"

# Определяем переменные 
In [203]: intf = 'gi0/10'
In [204]: vlan = 10
In [205]: mac = '0000.deed.beef'

#Выводим в форматированном виде
In [206]: intf_tmpl.format(intf, vlan, mac)
Out[206]: 'gi0/10100000.deed.beef'

# Т.к. все поля шаблона "слиплись"
# Можно задать фиксрованную длину каждого поля шалона
# Соответственно фиксированной длины 7, 5 и 15
In [209]: intf_tmpl = "{:7}{:5}{:15}"
# В итоге фаблон отформатирует строки уже по фиксированной длине
In [210]: intf_tmpl.format(intf, vlan, mac)
Out[210]: 'gi0/10    100000.deed.beef '

# Т.к переменная Vlan - имеет тип interger, 
# то она по умолчанию форматируется справа
# Чтобы исправить это можно принудительно указать "край" форматирования
In [211]: intf_tmpl = "{:7}{:<5}{:15}"

# Тогда шаблон выглядет нормально
In [212]: intf_tmpl.format(intf, vlan, mac)
Out[212]: 'gi0/10 10   0000.deed.beef '

# И в результате строки форматируются ровно по столбцам
In [213]: intf = 'gi0/1'
In [214]: intf_tmpl.format(intf, vlan, mac)
Out[214]: 'gi0/1  10   0000.deed.beef '
# Можно рассмотреть такой вариант шаблона
In [220]: intf_tmpl = '''
     ...: interface:  {}
     ...: vlan:       {}
     ...: mac:        {}
     ...: '''

# Тогда
In [221]: intf_tmpl.format(intf, vlan, mac)
Out[221]: '\ninterface:  gi0/1\nvlan:       10\nmac:        0000.deed.beef\n'

# В print это выглядет 
In [222]: print(intf_tmpl.format(intf, vlan, mac))

interface:  gi0/1
vlan:       10
mac:        0000.deed.beef
# Еще вариант использования форматированного шаблона
In [241]: intf_tmpl = '''
     ...: Название интерфейса {intf}
     ...: interface:  {intf}
     ...: vlan:       {vlan}
     ...: mac:        {mac}
     ...: '''

In [242]: print (intf_tmpl.format(intf='gi0/0/0', vlan='10', mac='0000.dead.beef'))

Название интерфейса gi0/0/0
interface:  gi0/0/0
vlan:       10
mac:        0000.dead.beef

Конветирование систем при помощи форматирования:

# Преобразование 10ой цифры в двоичный вид
In [227]: '{:b}'.format(255)
Out[227]: '11111111'

In [228]: '{:b}.{:b}{:b}{:b}'.format(192, 168, 0, 1)
Out[228]: '11000000.1010100001'


In [229]: '{:b}'.format(255)
Out[229]: '11111111'

In [230]: '{:b}.{:b}.{:b}.{:b}'.format(192, 168, 0, 1)
Out[230]: '11000000.10101000.0.1'

# Чтобы двоичными знаков было 8 зададим от 0 до 8 
In [231]: '{:08b}.{:08b}.{:08b}.{:08b}'.format(192, 168, 0, 1)

# Тогда получится вот в таком виде
Out[231]: '11000000.10101000.00000000.00000001'

Последнее обновление: 2023-05-29