Еще одно ненужное руководство по Python: Строковые переменные

На Python можно писать почти все: от мини-скриптов для администрирования до графических редакторов, от веб-сайтов до игр. И везде требуется работа со строками. Здесь будет рассказано, какие виды строк есть в питоне, какие функции есть для управления ими.

Как создать строковую переменную?

Очень просто.

>>> x = "Hello world!"

или

>>> y = 'Hello world!'
>>> print x == y
True

При создании строк можно пользоваться как одинарными кавычками (‘), так и двойными (“). В отличие от языков типа PHP или Perl, разницы нет никакой, и в выражении с двойными кавычками никаких подстановок не будет.

Если хотите сделать строковую переменную, которая будет содержать несколько строк “обыкновенных”, то можно пользоваться символом разделения строки “\n”. Также в питоне есть удобный способ создания больших строк – через три подряд идущие кавычки:

>>> x = "This is\nbig string.\nAnd this string\nhas \"quotes\"."
>>> y = """This is
... big string.
... And this string
... has "quotes"."""
>>> print x == y
True

Можно использовать и три одинарные кавычки. Главное, чтобы вы не путали потом одинарные и двойные.

Типы строк в питоне

Да, строки бывают разные. Бывают простые строки. Как те, что были показаны выше. Есть строки юникодные:

>>> x = u"2² = 5, при дост∀точно больших зн∀ч∃ниях 2"
>>> print x
2² = 5, при дост∀точно больших зн∀ч∃ниях 2
>>> print type(x)
<type 'unicode'>
>>> print type("simple string")
<type 'str'>
Если вы будете использовать в программе на питоне символы, отличные от latin-1 (все, что есть на клавиатуре в английской раскладке), то вам следует вставить строку # -*- coding: utf-8 -*- в начало программы. utf-8 – это кодировка, в котором ваш файл написан. В интерпретаторе такие манипуляции не нужны.

Строки могут быть сырые (raw):

>>> x = r"Hello\nworld!"
>>> print x
Hello\nworld!
>>> print type(x)
<type 'str'>

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

Подстановка значений в строки

Хочется аналога sprintf, чтобы в строку можно было подставлять любые значения?

>>> print "Вот вам пример: %s" % "Эта строка была вставлена"
Вот вам пример: Эта строка была вставлена

Можно вставлять несколько значений. Для этого должен использоваться кортеж (не список):

>>> print "%d * %d = %d" % (3, 3, 9)
3 * 3 = 9

А если использовать словарь, то аргументы можно вставлять даже по именам:

>>> print """Сюда будет вставлен первый аргумент: %(first)s, 
... а сюда - второй: %(second)s.
... И число в конце: %(number)f""" % {
...    'number': 3.14159,
...    'second': 'Вторая строка',
...    'first':  'Первая строка'
... }
Сюда будет вставлен первый аргумент: Первая строка, 
а сюда - второй: Вторая строка.
И число в конце: 3.141590

Можно, кстати, разделять исходную строку и вставляемые значения на отдельные переменные:

>>> mystring = "mystring %s"
>>> argument = "argument"
>>> print mystring % argument
mystring argument

Подробнее – в http://docs.python.org/library/stdtypes.html#string-formatting

Преобразование чего угодно в строку

Это очень просто:

>>> x = str(123)
>>> print x, type(x)
123 <type 'str'>

Или, если строка должна быть юникодной:

>>> x = unicode(456)
>>> print x, type(x)
456 <type 'unicode'>

Преобразовать в строку можно что угодно:

>>> print str(str)
<type 'str'>
>>> print str({'hello': 'world'})
{'hello': 'world'}

Правда, это не всегда то, что вы хотели получить. Если да – то придется придумывать что-то свое.

Преобразование строки во что угодно

А вот это не очень просто. Для простых типов есть встроенные преобразования:

>>> x = int("123")
>>> print x, type(x)
123 <type 'int'>
>>> y = float("1.23")
>>> print y, type(y)
1.23 <type 'float'>
>>> x = int("not a number")
Traceback (most recent call last):
  File "convert_my_to_html.py", line 14, in ex
    exec command in globals()
  File "<string>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'not a number'

Если же захотите преобразовать строку в свой собственный тип – то писать такой конвертер вам.

Операции над строками

Строки можно складывать. Друг с другом.

>>> print "a" + "b"
ab
>>> print "a" + 1
Traceback (most recent call last):
  File "convert_my_to_html.py", line 14, in ex
    exec command in globals()
  File "<string>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
>>> print 1 + "a"
Traceback (most recent call last):
  File "convert_my_to_html.py", line 14, in ex
    exec command in globals()
  File "<string>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Если сложить обычную строку с юникодной, то получится юникодная (это было очевидно, правда?).

Вычитать строки нельзя, увы. Зато строку можно умножить на число:

>>> print "hello " * 5
hello hello hello hello hello 

Делить строки нельзя.

Функции для работы со строками. Методы объекта строки

Те, кто прочитал help(str), могут не читать все, что будет ниже.

Строки можно выравнивать по краям или по центру:

>>> print "|" + "Hello".ljust(10) + "|"
|Hello     |
>>> print "|" + "Hello".rjust(10) + "|"
|     Hello|
>>> print "|" + "Hello".center(10) + "|"
|  Hello   |

Можно приводить все к верхнему/нижнему регистру:

>>> x = u"СъЕшЬ ЕщЁ эТиХ мЯгКиХ французских булок, да выпей чаю."
>>> print x.lower()
съешь ещё этих мягких французских булок, да выпей чаю.
>>> print x.upper()
СЪЕШЬ ЕЩЁ ЭТИХ МЯГКИХ ФРАНЦУЗСКИХ БУЛОК, ДА ВЫПЕЙ ЧАЮ.
>>> print x.capitalize()
Съешь ещё этих мягких французских булок, да выпей чаю.

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

>>> x = "    test string  "
>>> print "|" + x.lstrip() + "|"
|test string  |
>>> print "|" + x.rstrip() + "|"
|    test string|
>>> print "|" + x.strip() + "|"
|test string|

Проверить, принадлежит ли одна подстрока второй, очень просто:

>>> print "Hello".startswith("He")
True
>>> print "Hello".startswith("No")
False
>>> print "Hello".endswith("lo")
True
>>> print "el" in "Hello"
True
>>> print "what?" in "Hello"
False

Проверка на то, какие символы находятся в строке:

>>> str_list = ["123", "hello", "WORLD", "  ", "Test"]
>>> for s in str_list:
...     out = "%s: " % s
...     if s.isalpha(): 
...         out += "alpha "
...     if s.isdigit(): 
...         out += "digit "
...     if s.islower(): 
...         out += "lower "
...     if s.isspace(): 
...         out += "space "
...     if s.istitle(): 
...         out += "title "
...     if s.isupper(): 
...         out += "upper "
...     print out
123: digit 
hello: alpha lower 
WORLD: alpha upper 
  : space 
Test: alpha title 

Немного магии: вы, скорее всего не поймете, что здесь написано, но оно делает точно то же самое, что пример выше. Только размер кода меньше. Показываю просто так, чтобы вы знали, что на питоне можно писать короткие программы.

>>> str_list = ["123", "hello", "WORLD", "  ", "Test"]
>>> method_list = ["alpha", "digit", "lower", "space", "title", "upper"]
>>> for s in str_list:
...     res = " ".join(x for x in method_list if s.__getattribute__("is" + x)())
...     print "%s: %s" % (s, res)
123: digit
hello: alpha lower
WORLD: alpha upper
  : space
Test: alpha title

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

>>> n = "01234567890"
>>> x = "hello world"
>>> print x.find('o')
4
>>> print x.rfind('o')
7
>>> print x.find('o wor')
4
>>> print x.find('nothing')
-1

Ну и самое вкусное напоследок. Разбиение строки, слияние строк, замена в строке. Начнем с замены одной подстроки на другую:

>>> x = "<script>alert('oops&')</script>"
>>> x = x.replace("&", "&amp;")
>>> x = x.replace("<", "&lquot;").replace(">", "&rquot;")
>>> print x
&amp;lquot;script&amp;rquot;alert('oops&amp;amp;')&amp;lquot;/script&amp;rquot;

Строку можно разбить на куски, разделенные указанной подстрокой:

>>> x = "Give me all words from this sentense"
>>> print x.split(" ")
['Give', 'me', 'all', 'words', 'from', 'this', 'sentense']
>>> y = u"Give me 3 words from this sentense"
>>> print y.split(" ", 3)
['Give', 'me', '3', 'words from this sentense']
>>> print y.rsplit(" ", 3)
['Give me 3 words', 'from', 'this', 'sentense']

И строки можно объединять:

>>> print ", ".join(["1", "2", "3"])
1, 2, 3