Python обозначение любого символа

Символы в языке Python

Тип char – это тип данных, служащий для хранения одиночных символов в различных кодировках.

Он широко используется в более низкоуровневых языках программирования, таких как C. Даже строки там являются массивами, состоящими из элементов типа char.

В Python нет отдельного типа для символов. Даже если присвоить переменной значение ‘а’, она будет иметь строковый тип.

Альтернатива char в Python 3

Разработчики языка решили, что нет необходимости выделять под отдельные символы целый тип. На то есть несколько причин:

  • Строковый тип предоставляет программисту весь нужный функционал для работы как со строками, так и с символами.
  • Python – язык с динамической типизацией, разделение на строковый и символьный тип добавило бы дополнительных проблем с реализацией автоматического определения типов.

Поэтому как бы программист ни пытался, переменные будут иметь строковый тип:

s = ‘Hello’ s = s[0] # Присваиваем переменной элемент ‘H’ print(type(s))

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

Строка — это неизменяемая последовательность, а так как символ тоже строка, то при попытке изменить его, возбудится исключение:

s = 'О' s[0] = 'А' # Исключение TypeError

Функции

Несмотря на объединение двух типов, язык программирования Python 3 имеет функции для работы именно с символами.

Каждый элемент строки — закодированная последовательность битов. В Python символы могут быть представлены в виде целого числа int. Для работы с их обычным и числовым представлением используют встроенные функции ord() и chr() .

ord()

Функция возвращает числовое представление символа, переданного в качестве аргумента. То есть с её помощью в Python можно определить код символа (аналогичная функция есть и в C для приведения char к int), например:

Функция работает, только если в качестве аргумента передан один символ, при попытке передать строку возбудится исключение TypeError. С её помощью можно получить числовое представление любого символа кодировки Юникод.

chr()

Функция возвращает символ, соответствующий его числовому представлению, которое передается в качестве аргумента:

В качестве аргумента можно передать любое целое неотрицательное число вплоть до 1114111. В противном случае возбудится исключение ValueError.

Экранирование

Экранированные символы — это специальные символы после обратной косой черты «\», выполняющие определенные действия и преобразования.

Экранированная последовательность Функция
\n Переход на новую строку
\t Табуляция
\r Возврат каретки в начало строки
\x Числа в шестнадцатеричном представлении
\o Числа в восьмеричном представлении
\0 Нулевой символ
\’ Апостроф
Двойная кавычка
\\ Обратный слэш

Экранированные символы также называются escape-последовательностями, с их помощью можно, например, форматировать строки —

s = "Привет,\n\"Сергей\"" print(s) #Выведет: Привет, "Сергей"

Подавление экранирования

Иногда программисту нужно, чтобы обратный слеш не превращал элементы в escape-последовательности, например, при работе с путями к файлам. Для этого необходимо использовать сразу две косых черты: «C:\\Users\\Public».

Когда программист хочет использовать обратный слеш для вывода, но не подавляет экранирование, в некоторых случаях даже возбуждается исключение. В следующем примере есть синтаксическая ошибка из-за того, что с «\U» начинается записть 32-битного символа Юникода (с «\u» — 16-битного). После него должна быть последовательность из 8 цифр, поэтому возникла ошибка:

s = "C:\Users\Public" SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

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

s = r"C:\Users\Public" print(s) C:\Users\Public

Подавить экранирование можно с помощью «r», который ставится перед началом строки (до кавычек). На самом деле интерпретатор, видя перед строкой «r», автоматически дублирует каждый символ обратного слеша. Если использовать это в интерактивном режиме, мы увидим:

>>> s = r"C:\Users\Public" >>> s 'C:\\Users\\Public'

Строка, в которой подавляется экранирование, не может оканчиваться символом обратного слеша. В противном случае интерпретатор возбудит исключение SyntaxError.

Решить эту проблему можно несколькими способами:

  • Дублировать символы экранирования вручную.
  • Использовать конкатенацию: s = r»Привет,\nмир» + «\\» .

Источник

Специальные символы#

Чаще всего точка используется с символами повторения + и * , чтобы указать, что между определенными выражениями могут находиться любые символы.

Например, с помощью выражения Interface.+Port ID.+ можно описать строку с интерфейсами в выводе sh cdp neighbors detail:

In [1]: cdp = ''' . SW1#show cdp neighbors detail . ------------------------- . Device ID: SW2 . Entry address(es): . IP address: 10.1.1.2 . Platform: cisco WS-C2960-8TC-L, Capabilities: Switch IGMP . Interface: GigabitEthernet1/0/16, Port ID (outgoing port): GigabitEthernet0/1 . Holdtime : 164 sec . ''' In [2]: re.search(r'Interface.+Port ID.+', cdp).group() Out[2]: 'Interface: GigabitEthernet1/0/16, Port ID (outgoing port): GigabitEthernet0/1' 

В результат попала только одна строка, так как точка обозначает любой символ, кроме символа перевода строки. Кроме того, символы повторения + и * по умолчанию захватывают максимально длинную строку. Этот аспект рассматривается в подразделе «Жадность символов повторения».

Символ ^ означает начало строки. Выражению ^\d+ соответствует подстрока:

In [3]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [4]: re.search(r'^\d+', line).group() Out[4]: '100' 

Символы с начала строки и до решетки (включая решетку):

In [5]: prompt = 'SW1#show cdp neighbors detail' In [6]: re.search(r'^.+#', prompt).group() Out[6]: 'SW1#' 

Символ $ обозначает конец строки.

Выражение \S+$ описывает любые символы, кроме whitespace в конце строки:

In [7]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [8]: re.search(r'\S+$', line).group() Out[8]: 'FastEthernet0/1' 

Символы, которые перечислены в квадратных скобках, означают, что любой из этих символов будет совпадением. Таким образом можно описывать разные регистры:

In [9]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [10]: re.search(r'[Ff]ast', line).group() Out[10]: 'Fast' In [11]: re.search(r'[Ff]ast[Ee]thernet', line).group() Out[11]: 'FastEthernet' 

С помощью квадратных скобок можно указать, какие символы могут встречаться на конкретной позиции. Например, выражение ^.+[>#] описывает символы с начала строки и до решетки или знака больше (включая их). С помощью такого выражения можно получить имя устройства:

In [12]: commands = ['SW1#show cdp neighbors detail', . : 'SW1>sh ip int br', . : 'r1-london-core# sh ip route'] . : In [13]: for line in commands: . : match = re.search(r'^.+[>#]', line) . : if match: . : print(match.group()) . : SW1# SW1> r1-london-core# 

В квадратных скобках можно указывать диапазоны символов. Например, таким образом можно указать, что нас интересует любая цифра от 0 до 9:

In [14]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [15]: re.search(r'8+', line).group() Out[15]: '100' 

Аналогичным образом можно указать буквы:

In [16]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [17]: re.search(r'[a-z]+', line).group() Out[17]: 'aa' In [18]: re.search(r'[A-Z]+', line).group() Out[18]: 'F' 

В квадратных скобках можно указывать несколько диапазонов:

In [19]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [20]: re.search(r'[a-f0-9]+\.[a-f0-9]+\.[a-f0-9]+', line).group() Out[20]: 'aa12.35fe.a5d3' 

Выражение [a-f0-9]+\.[a-f0-9]+\.[a-f0-9]+ описывает три группы символов, разделенных точкой. Символами в каждой группе могут быть буквы a-f или цифры 0-9. Это выражение описывает MAC-адрес.

Еще одна особенность квадратных скобок — специальные символы внутри квадратных скобок теряют свое специальное значение и обозначают просто символ. Например, точка внутри квадратных скобок будет обозначать точку, а не любой символ.

Выражение [a-f0-9]+[./][a-f0-9]+ описывает три группы символов:

Для строки line совпадением будет такая подстрока:

In [21]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [22]: re.search(r'[a-f0-9]+[./][a-f0-9]+', line).group() Out[22]: 'aa12.35fe' 

Если после открывающейся квадратной скобки указан символ ^ , совпадением будет любой символ, кроме указанных в скобках:

In [23]: line = 'FastEthernet0/0 15.0.15.1 YES manual up up' In [24]: re.search(r'[^a-zA-Z]+', line).group() Out[24]: '0/0 15.0.15.1 ' 

В данном случае выражение описывает все, кроме букв.

Вертикальная черта работает как „или“:

In [25]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [26]: re.search(r'Fast|0/1', line).group() Out[26]: 'Fast' 

Обратите внимание на то, как срабатывает | — Fast и 0/1 воспринимаются как целое выражение. То есть, в итоге выражение означает, что мы ищем Fast или 0/1, а не то, что мы ищем Fas, затем t или 0 и 0/1.

Скобки используются для группировки выражений. Как и в математических выражениях, с помощью скобок можно указать, к каким элементам применяется операция.

Например, выражение 4([a-f]|1)2 описывает три символа: цифра, потом буква или цифра и цифра:

In [27]: line = "100 aa12.35fe.a5d3 FastEthernet0/1" In [28]: re.search(r'4([a-f]|1)8', line).group() Out[28]: '100' 

Скобки позволяют указывать, какое выражение является одним целым. Это особенно полезно при использовании символов повторения:

In [29]: line = 'FastEthernet0/0 15.0.15.1 YES manual up up' In [30]: re.search(r'(3+\.)+1+', line).group() Out[30]: '15.0.15.1' 

Скобки позволяют не только группировать выражения. Строка, которая совпала с выражением в скобках, запоминается. Ее можно получить отдельно с помощью специальных методов groups и group(n). Это рассматривается в подразделе «Группировка выражений».

Источник

Читайте также:  Text to base64 java
Оцените статью