Чарівний Python Текстова обробка у мові Python
Підказки для початківців
Серія контенту:
Цей контент є частиною # із серії # статей: Чарівний Python
Цей контент є частиною серії: Чарівний Python
Слідкуйте за виходом нових статей цієї серії.
Що таке Python?
Python - це вільно доступна, інтерпретована мова дуже високого рівня, розроблена Гвідо ван Россумом. Він поєднує ясний синтаксис із потужною (але необов'язковою) об'єктно-орієнтованою семантикою. Python широко поширений і високопортабельний.
Рядки - незмінні послідовності
Як і в більшості високорівневих мов програмування, рядки змінної довжини є базовим типом у мові Python. Python виділяє область пам'яті для зберігання рядків (або інших значень) "за лаштунками", там, де програмісту не потрібно особливо замислюватися про це. Крім того, Python має кілька можливостей керування рядками, які відсутні в інших високорівневих мовах.
У мові Python рядки є "незмінювані послідовності" ("immutable sequences"). Програма може звертатися до елементів чи підпослідовностей рядків як до будь-яких послідовностей, незважаючи на те, що рядки, як і кортежі (tuples), не можуть бути змінені безпосередньо "на місці". Python звертається до підпослідовностей за допомогою гнучкої операції "зрізу", формат якої нагадує завдання діапазону рядків та стовпців в електронній таблиці. Наведена нижче інтерактивна сесія ілюструє використання рядків та зрізів.
Рядки та зрізи
Інша багатозначна рядкова операція – просто ключове слово in. Воно пропонує дві інтуїтивні та корисні конструкції:
Ключове слово "in"
Єкілька способів написання рядкових констант у мові Python. Ви можете використовувати як одинарні, так і подвійні лапки за умови, що символи відкриття та закриття відповідають один одному, а також існують інші варіанти функціонального використання лапок. Якщо ваш рядок містить переклади рядка або вкладені лапки, потрійні лапки надають зручний спосіб такого роду рядків, як це зроблено в наступному прикладі:
Використання потрійних лапок
Як одинарні, так і потрійні лапки можуть передуватись буквою "r" для позначення того, що спеціальні символи регулярних виразів не повинні інтерпретуватися Python. Наприклад:
Використання "r-рядків"
У "r-рядках" зворотний слеш, який може служити для завдання спеціального символу, обробляється як звичайний зворотний слеш. Це далі при розгляді регулярних выражений.
Файли та рядкові змінні
Коли ми говоримо "текстова обробка", ми зазвичай маємо на увазі обробку вмісту файлу. На мові Python не важко вважати вміст текстового файлу в рядкові змінні, де цим вмістом можна маніпулювати. Файлові об'єкти забезпечують три способи читання: .read(), .readline(), and .readlines(). Кожен із цих методів може приймати аргумент для обмеження обсягу даних, які зчитуються за один раз, проте в основному вони використовуються без аргументу. .read() зчитує весь файл за один раз, і зазвичай використовується для розміщення вмісту файлу в рядкову змінну. Хоча .read() дає найбільш пряме рядкове представлення вмісту файлу, він незручний для послідовної рядково орієнтованої обробки файлу, до того ж це неможливо, якщо розмір файлу перевищує обсяг наявної пам'яті.
..readline() і .readlines() дуже схожі. І та й інша використовуються в конструкціях на кшталт наступної:
Відмінність між .readline() і .readlines() у цьому, що остання, як і .read(), зчитує весь файл за один раз. .readlines() автоматично парсить вміст файлу до списку рядків, який можна обробити за допомогою конструкції мови Python for . in. З іншого боку, .readline() зчитує лише один рядок за раз, і в цілому працює набагато повільніше, ніж .readlines(). .readline() слід використовувати тільки якщо пам'яті не вистачає для зчитування всього файлу за один раз.
Якщо ви використовуєте стандартний модуль, що працює з файлами, ви можете перетворити рядок на "віртуальний файл" за допомогою модуля cStringIO (якщо потрібно створення похідних класів, можна використовувати StringIO, але початківцям це рідко). Наприклад:
cStringIO-модуль
Не забувайте, проте, що, на відміну від цього файлу, "віртуальний файл", сформований cStringIO - тимчасовий. Він зникне, коли програма завершиться, якщо ви не зробите жодних кроків, щоб його зберегти (наприклад, запишете його в реальний файл або скористаєтеся модулем shelve або базою даних).
Стандартний модуль: string
import string
Основне правило полягає в тому, що якщо ви можете розв'язати задачу за допомогою модуля string, це правильний спосіб її вирішення. На відміну від re (регулярних виразів), функції string в цілому набагато швидше і здебільшого простіше для розуміння та використання. Сторонні модулі мови Python, включаючи деякі швидкі, написані на С розширення, призначені для спеціалізованих завдань, проте переносимість і простота, тим не менш, визначають прив'язку до string скрізь, де тільки можливо. Є тавиняток, однак не так багато, як ви можете подумати, маючи досвід використання інших мов.
Модуль string містить кілька типів інструментів, таких як функції, методи та класи. Він також містить найбільш загальні строкові константи. Наприклад:
Приклад 1 використання string
Хоча ви можете написати ці константи самі, версії string більш менш гарантують, що ваші константи будуть правильні з точки зору національної мови і платформи, на якій виконується ваш скрипт на Python.
string також включає функції, що перетворюють рядки звичайними способами (які можна об'єднати для отримання деяких незвичайних перетворень). Наприклад:
Приклад 2 використання string
Існує безліч інших перетворень, не проілюстрованих тут; Ви можете знайти подробиці у посібнику з мови Python.
Крім того, ви можете користуватися функціями string для отримання інформації про такі атрибути рядка, як довжина або позиції підрядка, наприклад:
Приклад 3 використання string
І нарешті, string надає дуже характерну для мови Python особливість. Пара .split() і .join() забезпечує швидкий спосіб перетворення рядків у кортежі і навпаки, що ви знайдете дуже корисним. Реалізується це просто:
Приклад 4 використання string
Безумовно, у реальному житті ви швидше за все робитимете зі списком щось ще, окрім негайного об'єднання його викликом .join() (можливо, щось, що включає знайому конструкцію for. in. ).
Стандартний модуль: re
Модуль re робить застарілими модулі regex та regsub, які використовувалися у старих кодах мовою Python. Хоча у використанні regex зберігаються невеликі переваги, вони незначні та нестоять того, щоб використовувати його в новому коді. Застарілі модулі, швидше за все, будуть виключені з нових версій Python, і в 1.6, можливо, буде включений удосконалений модуль re. Так що використовуйте re для регулярних виразів.
Регулярний вираз – це короткий шлях до опису зразків (pattern), які можуть зустрітися у тексті. Чи зустрічаються якісь символи? Чи в певному порядку? Чи повторюються ділянки тексту це число разів? Чи виключено збіг інших ділянок? Концептуально це не так вже й несхоже на те, як ви інтуїтивно описуєте поняття зразка природною мовою. Хитрість полягає в кодуванні цього опису компактний синтаксис регулярних виразів.
Розглядайте регулярне вираження як окрему проблему програмування, незважаючи на те, що в ньому можуть бути задіяні лише один-два рядки коду; ці рядки, по суті, становлять невелику програму.
Почніть із найменших фрагментів. На нижньому рівні будь-яке регулярне вираз включатиме зіставлення з конкретними "символьними класами" ("character classes"). Найпростіший символьний клас є окремим символом, який просто входить у зразок як літерал. Вам часто може знадобитися порівняти клас символів. Ви можете позначити клас, уклавши його у квадратні дужки; всередині дужок можна помістити як набір, так і діапазони символів, які позначаються тире. Крім того, ви можете використовувати різні іменовані символьні класи, коректні для вашої платформи та національної мови. Декілька прикладів:
Символьні класи
Ви можете представляти символьні класи у вигляді "атомів" регулярних виразів і, швидше за все, захочете згрупувати ці атоми в "молекули". Це можна зробити за допомогою комбінаціїугруповання та повторення. Угруповання позначається круглими дужками: кожен з подвиражений, що містяться в дужках, розглядається як атомарне для наступного угруповання або повторення. Повторення відзначається одним із наступних операторів: "*" означає "нуль або більше"; "+" означає "один або більше"; "?" що означає "нуль або один". Як приклад погляньте на вираз:
Щоб рядок відповідав цьому виразу, він повинен містити щось, що починається з ABC і закінчується на XYZ - але що має бути в середині? Середнім виразом є ([d-w]*dd), що супроводжується оператором "один або багато". Таким чином, середина рядка повинна складатися з одного (або двох або однієї тисячі) фрагментів, що відповідають виразу в дужках. Рядок "ABCXYZ" йому не відповідає, тому що не містить необхідних елементів у середині.
Що ж це внутрішній подвиражение? Воно починається з нуля чи більше літер в інтервалі від d до w. Важливо, що нуль букв представляє правильне зіставлення, що може бути контрінтуїтивним, якщо ви скористаєтеся його опису словом " кілька " . У наступному рядку має бути точно одна цифра; потім жодної чи однієї додаткова цифра. (Перший цифровий символьний клас немає оператора повторення, цим просто зустрічається один раз. Другий цифровий символьний клас має оператор "?"). Коротше кажучи, все це має на увазі "одну чи кілька цифр". Деякі рядки, що задовольняють регулярному виразу, виглядають так:
А ось кілька виразів, які не порівнюються з цим виразом:
Потрібна деяка практика, щоб навчитися створення та розуміння регулярних виразів. Однак як тільки ви освоїте регулярні висловлювання, у вашомурозпорядженні виявиться потужна виразна сила. Все це говорить про те, що часто простіше використовувати регулярні висловлювання для вирішення проблеми, яка цілком може бути вирішена і за допомогою примітивніших (і швидких) інструментів, наприклад модуля string.
Ресурси для скачування
Схожі теми
- "Опанування Регулярними Виразами"стандартний і повний довідник з регулярних виразів від Джеффрі Е. Ф. Фрідля (Jeffrey E. F. Friedl) (O'Reilly and Associates, 1997).
- Регулярні вирази у "how-to документі" з Python.org.
- Огляд регулярних виразів від Університету Кентуккі.
- Для детального ознайомлення з деякими більш ранніми інструментами обробки тексту, дуже функціональними і досі широко використовуваними, зверніться до "Sed & Awk" від Дейла Догерті (Dale Dougherty) та Арнольда Роббінса (Arnold Robbins) (O'Reilly and Associates, 1997) ).
- Прочитайте про "mxTextTools" інструменти швидкого поводження з текстом для Python.