Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Обработка текстов. Регулярные выражения. Unicode
Модуль string
До того как у строк появились методы, для операций над строками применялся модуль string. Приведенный пример демонстрирует, как вместо функции из string использовать метод (кстати, последнее более эффективно):
>>> import string >>> s = "one,two,three" >>> print string.split(s, ",") ['one', 'two', 'three'] >>> print s.split(",") ['one', 'two', 'three']
В версии Python 3.0 функции, которые доступны через методы, более не будут дублироваться в модуле string.
В Python 2.4 появилась альтернатива использованию операции форматирования: класс Template. Пример:
>>> import string >>> tpl = string.Template("$a + $b = ${c}") >>> a = 2 >>> b = 3 >>> c = a + b >>> print tpl.substitute(vars()) 2 + 3 = 5 >>> del c # удаляется имя c >>> print tpl.safe_substitute(vars()) 2 + 3 = $c >>> print tpl.substitute(vars(), c=a+b) 2 + 3 = 5 >>> print tpl.substitute(vars()) Traceback (most recent call last): File "/home/rnd/tmp/Python-2.4b2/Lib/string.py", line 172, in substitute return self.pattern.sub(convert, self.template) File "/home/rnd/tmp/Python-2.4b2/Lib/string.py", line 162, in convert val = mapping[named] KeyError: 'c'
Объект-шаблон имеет два основных метода: substitute() и safe_substitute(). Значения для подстановки в шаблон берутся из словаря ( vars() содержит словарь со значениями переменных) или из именованных фактических параметров. Если есть неоднозначность в задании ключа, можно использовать фигурные скобки при написании ключа в шаблоне.
Методы строк
В таблице ниже приведены некоторые наиболее употребительные методы объектов-строк и unicode-объектов.
В следующем примере применяются методы split() и join() для разбиения строки в список (по разделителям) и обратное объединение списка строк в строку
>>> s = "This is an example." >>> lst = s.split(" ") >>> print lst ['This', 'is', 'an', 'example.'] >>> s2 = "\n".join(lst) >>> print s2 This is an example.
Для проверки того, оканчивается ли строка на определенное сочетание букв, можно применить метод endswith():
>>> filenames = ["file.txt", "image.jpg", "str.txt"] >>> for fn in filenames: ... if fn.lower().endswith(".txt"): ... print fn ... file.txt str.txt
Поиск в строке можно осуществить с помощью метода find(). Следующая программа выводит все функции, определенные в модуле оператором def:
import string text = open(string.__file__[:-1]).read() start = 0 while 1: found = text.find("def ", start) if found == -1: break print text[found:found + 60].split("(")[0] start = found + 1
Важным для преобразования текстовой информации является метод replace(), который рассматривается ниже:
>>> a = "Это текст , в котором встречаются запятые , поставленные не так." >>> b = a.replace(" ,", ",") >>> print b Это текст, в котором встречаются запятые, поставленные не так.
Рекомендации по эффективности
При работе с очень длинными строками или большим количеством строк, применяемые операции могут по-разному влиять на быстродействие программы.
Например, не рекомендуется многократно использовать операцию конкатенации для склеивания большого количества строк в одну. Лучше накапливать строки в списке, а затем с помощью join() собирать в одну строку:
>>> a = "" >>> for i in xrange(1000): ... a += str(i) # неэффективно! ... >>> a = "".join([str(i) for i in xrange(1000)]) # более эффективно
Конечно, если строка затем обрабатывается, можно применять итераторы, которые позволят свести использование памяти к минимуму.
Модуль StringIO
В некоторых случаях желательно работать со строкой как с файлом. Модуль StringIO как раз дает такую возможность.
Открытие "файла" производится вызовом StringIO(). При вызове без аргумента - создается новый "файл", при задании строки в качестве аргумента - "файл" открывается для чтения:
import StringIO my_string = "1234567890" f1 = StringIO.StringIO() f2 = StringIO.StringIO(my_string)
Далее с файлами f1 и f2 можно работать как с обычными файловыми объектами.
Для получения содержимого такого файла в виде строки применяется метод getvalue():
f1.getvalue()
Противоположный вариант (представление файла на диске в виде строки) можно реализовать на платформах Unix и Windows с использованием модуля mmap. Здесь этот модуль рассматриваться не будет.
Модуль difflib
Для приблизительного сравнения двух строк в стандартной библиотеке предусмотрен модуль difflib.
Функция difflib.get_close_matches() позволяет выделить n близких строк к заданной строке:
get_close_matches(word, possibilities, n=3, cutoff=0.6)
где
word
Строка, к которой ищутся близкие строки.
possibilities
Список возможных вариантов.
n
Требуемое количество ближайших строк.
cutoff
Коэффициент (из диапазона [0, 1]) необходимого уровня совпадения строк. Строки, которые при сравнении с word дают меньшее значение, игнорируются.
Следующий пример показывает функцию difflib.get_close_matches() в действии:
>>> import unicodedata >>> names = [unicodedata.name(unicode(chr(i))) for i in range(40, 127)] >>> print difflib.get_close_matches("LEFT BRACKET", names) ['LEFT CURLY BRACKET', 'LEFT SQUARE BRACKET']
В списке names - названия Unicode-символов с ASCII-кодами от 40 до 127.