Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

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.

Регулярные выражения

Рассмотренных стандартных возможностей для работы с текстом достаточно далеко не всегда. Например, в методах find и replace задается всего одна строка. В реальных задачах такая однозначность встречается довольно редко, чаще требуется найти или заменить строки, отвечающие некоторому шаблону.

Регулярные выражения (regular expressions) описывают множество строк, используя специальный язык, который сейчас и будет рассмотрен. (Строка, в которой задано регулярное выражение, будет называться шаблоном.)

Для работы с регулярными выражениями в Python используется модуль re. В следующем примере регулярное выражение помогает выделить из текста все числа:

Листинг

>>> import re

>>> pattern = r»[0–9]+»

>>> number_re = re.compile(pattern)

>>> number_re.findall(«122 234 65435»)

['122', '234', '65435']

В этом примере шаблон pattern описывает множество строк, которые состоят из одного или более символов из набора «0», «1» , …, «9» . Функция re.compile компилирует шаблон в специальный Regex–объект, который имеет несколько методов, в том числе метод findall для получения списка всех непересекающихся вхождений строк, удовлетворяющих шаблону, в заданную строку.

То же самое можно было сделать и так:

Листинг

>>> import re

>>> re.findall(r»[0–9]+», «122 234 65435»)

['122', '234', '65435']

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

Примечание:

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

Синтаксис регулярного выражения

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

Здесь стоит также отметить, что различные операции используют шаблон по–разному. Так, search ищет первое вхождение строки, удовлетворяющей шаблону, в заданной строке, а match требует, чтобы строка удовлетворяла шаблону с самого начала.

Поделиться:
Популярные книги

Противостояние

Гаевский Михаил
2. Стратег
Фантастика:
боевая фантастика
космическая фантастика
5.25
рейтинг книги
Противостояние

Роза ветров

Кас Маркус
6. Артефактор
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Роза ветров

Боярич Морозов

Шелег Дмитрий Витальевич
3. Наследник старого рода
Фантастика:
героическая фантастика
боевая фантастика
альтернативная история
7.12
рейтинг книги
Боярич Морозов

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ермак. Регент

Морской волк. 2-я Трилогия

Савин Владислав
2. Морской волк
Фантастика:
альтернативная история
8.91
рейтинг книги
Морской волк. 2-я Трилогия

Цесаревич Вася

Шкенёв Сергей Николаевич
1. Цесаревич
Фантастика:
попаданцы
альтернативная история
5.20
рейтинг книги
Цесаревич Вася

Хозяин Стужи 3

Петров Максим Николаевич
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи 3

Позывной "Князь" 3

Котляров Лев
3. Князь Эгерман
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Позывной Князь 3

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Точка Бифуркации

Смит Дейлор
1. ТБ
Фантастика:
боевая фантастика
7.33
рейтинг книги
Точка Бифуркации

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Охотник

Щепетнов Евгений Владимирович
Фантастика:
фэнтези
боевая фантастика
5.40
рейтинг книги
Охотник

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4