Очарователна обработка на текст на Python в Python

Съвети за начинаещи

Серия съдържание:

Това съдържание е част # от поредица # статии: Очарователен Python

Това съдържание е част от поредицата: Очарователен Python

Очаквайте нови статии от тази серия.

Какво е Python?

Python е свободно достъпен интерпретиран език на много високо ниво, разработен от Guido van Rossum. Той съчетава ясен синтаксис с мощна (но незадължителна) обектно-ориентирана семантика. Python е широко разпространен и много преносим.

Низовете са неизменни последователности

Както при повечето езици за програмиране на високо ниво, низовете с променлива дължина са основният тип в Python. Python разпределя пространство в паметта за съхраняване на низове (или други стойности) "зад кулисите", където програмистът не трябва да мисли много за това. В допълнение, Python има няколко функции за манипулиране на низове, които не се срещат в други езици на високо ниво.

В Python низовете са "неизменни последователности". Една програма може да има достъп до елементи или подпоследователности от низове, сякаш са някаква последователност, въпреки че низовете, като кортежите, не могат да бъдат модифицирани директно на място. Python осъществява достъп до подпоследователности с гъвкава операция "slice", която е подобна по формат на определянето на диапазон от редове и колони в електронна таблица. Интерактивната сесия по-долу илюстрира използването на низове и срезове.

Струкове и резени

Друга смислена операция с низ е просто ключовата дума in. Предлага две интуитивни и полезни конструкции:

Ключова дума "in"

Яжтеняколко начина за писане на низови константи в Python. Можете да използвате единични или двойни кавички, стига символите за отваряне и затваряне да съвпадат и има други функционални приложения за кавички. Ако вашият низ съдържа нови редове или вложени кавички, тройните кавички предоставят удобен начин да направите този вид низ, както в следния пример:

Използване на тройни кавички

Както единичните, така и тройните кавички могат да бъдат предшествани от "r", за да се покаже, че специалните символи на регулярни изрази не трябва да се интерпретират от Python. Например:

Използване на "r-низове"

В "r-низове" обратната наклонена черта, която иначе би могла да се използва за указване на специален знак, се третира като обикновена обратна наклонена черта. Това е обяснено по-нататък в обсъждането на регулярните изрази.

Файлове и низови променливи

Когато казваме "обработка на текст", обикновено имаме предвид обработка на съдържанието на файл. В Python е лесно да се прочете съдържанието на текстов файл в низови променливи, където съдържанието може да се манипулира. Файловите обекти предоставят три метода за четене: .read(), .readline() и .readlines(). Всеки от тези методи може да приеме аргумент, за да ограничи количеството данни, които се четат наведнъж, но те обикновено се използват без аргумент. .read() чете целия файл наведнъж и обикновено се използва за поставяне на съдържанието на файл в низова променлива. Въпреки че .read() предоставя най-директното низово представяне на съдържанието на файл, това е неудобно за обработка ред по ред на файл и не е възможно, ако файлът е по-голям от наличната памет.

..readline() и .readlines() са много сходни. И двете се използват в конструкции като следните:

Разликата между .readline() и .readlines() е, че последният, подобно на .read(), чете целия файл наведнъж. .readlines() автоматично анализира съдържанието на файла в списък от редове, които могат да бъдат обработени с помощта на конструкцията Python for. в. От друга страна, .readline() чете само един ред наведнъж и като цяло е много по-бавен от .readlines(). .readline() трябва да се използва само ако няма достатъчно памет за четене на целия файл наведнъж.

Ако използвате стандартния файлов модул, можете да превърнете низ във „виртуален файл“ с помощта на модула cStringIO (ако искате да извлечете класове, можете да използвате StringIO, но това рядко е необходимо за начинаещи). Например:

cStringIO-модул

Имайте предвид обаче, че за разлика от истинския файл, "виртуалният файл", генериран от cStringIO, е временен. Той ще изчезне, когато програмата приключи, освен ако не предприемете някои стъпки, за да го запазите (напр. да го запишете в истински файл или да използвате модула shelve или база данни).

Стандартен модул: низ

импортен низ

Основното правило е, че ако можете да разрешите проблем с модула за низове, това е правилният начин да го решите. За разлика от re (регулярни изрази), низовите функции обикновено са много по-бързи и в повечето случаи по-лесни за разбиране и използване. Модулите на Python на трети страни, включително някои бързи разширения, написани на C, са предназначени за специализирани задачи, но преносимостта и простотата все още диктуват обвързване към низ, където е възможно. Също така имаизключения, но не толкова много, колкото си мислите от опит с други езици.

Модулът за низ съдържа няколко вида инструменти като функции, методи и класове. Той също така съдържа най-често срещаните низови константи. Например:

Пример 1 с използване на низ

Докато можете сами да напишете тези константи, низовите версии повече или по-малко гарантират, че вашите константи са правилни по отношение на националния език и платформата, на която работи вашият Python скрипт.

string също включва функции, които преобразуват низове по обичайния начин (които можете да комбинирате, за да получите някои фантастични преобразувания). Например:

Пример 2 с използване на низ

Има много други трансформации, които не са илюстрирани тук; можете да намерите подробности в ръководството за език Python.

Освен това можете да използвате функциите за низове, за да получите информация за атрибутите на низ, като например дължината или позициите на подниз, например:

Пример 3 с използване на низ

И накрая, низ предоставя много характерна характеристика на езика Python. Двойката .split() и .join() предоставя бърз начин за конвертиране на низове в кортежи и обратно, което ще намерите за доста полезно. Изпълнява се просто:

Пример 4 с използване на низ

Разбира се, в реалния живот е по-вероятно да направите нещо друго със списъка, отколкото веднага да се присъедините към него с извикване .join() (може би нещо, включващо познатата for. in. конструкция).

Стандартен модул: re

Модулът re остарява модулите regex и regsub, които са били използвани в по-стар код на Python. Въпреки че има малки ползи от използването на регулярен израз, те са незначителни и неструва си да се използва в нов код. Отхвърлените модули вероятно ще бъдат премахнати от новите версии на Python и 1.6 може да включва подобрен re модул. Затова използвайте re за регулярни изрази.

Регулярният израз е съкратен начин за описание на модели (модел), които могат да се появят в текста. Има ли някакви символи? В определен ред ли е? Части от текст повтарят ли се определен брой пъти? Изключено ли е съвпадението на други раздели? Концептуално това не е толкова различно от начина, по който интуитивно описвате концепцията за модел на естествен език. Номерът е да кодирате това описание в компактен синтаксис на регулярен израз.

Третирайте регулярния израз като програмен проблем сам по себе си, дори ако може да включва само ред или два кода; тези редове по същество представляват малка програма.

Започнете с най-малките парчета. На най-ниското ниво всеки регулярен израз ще включва съвпадение срещу конкретни "класове знаци". Най-простият символен клас е единичен символ, който просто влиза в шаблона като литерал. Често трябва да съпоставите клас на знаци. Можете да посочите клас, като го поставите в квадратни скоби; вътре в скобите можете да поставите както набор, така и диапазони от знаци, които се означават с тире. Освен това можете да използвате различни наименувани класове символи, които са правилни за вашата платформа и локал. Няколко примера:

Класове на символи

Можете да мислите за символните класове като за "атоми" от регулярни изрази и вероятно ще искате да групирате тези атоми в "молекули". Това може да стане с комбинациягрупиране и повторение. Групирането е обозначено със скоби: всеки от подизразите, съдържащи се в скобите, се третира като атомен за последващо групиране или повторение. Повторението се маркира с един от следните оператори: "*" означава "нула или повече"; "+" означава "един или повече"; "?" което означава "нула или едно". Като пример, разгледайте израза:

За да съответства низ на този израз, той трябва да съдържа нещо, което започва с "ABC" и завършва с "XYZ" -- но какво трябва да е по средата? Средният подизраз е ([d-w]*\d\d?), последван от оператора "един или много". По този начин средата на реда трябва да се състои от един (или два, или хиляда) фрагмента, съответстващи на подизраза в скоби. Низът "ABCXYZ" не съвпада, защото не съдържа необходимите елементи в средата.

Какъв е този вътрешен подизраз? Започва с нула или повече букви между d и w. Важно е да се отбележи, че нула букви представляват валидно съвпадение, което може да бъде контраинтуитивно, ако използвате думата „няколко“, за да го опишете. Следващият ред трябва да съдържа точно една цифра; след това няма или една допълнителна цифра. (Първият клас от цифрови знаци няма оператор за повторение, така че се появява само веднъж. Вторият клас от цифрови знаци има оператор "?".) Накратко, всичко това предполага "една или повече цифри". Някои низове, които съответстват на регулярния израз, изглеждат така:

Ето няколко израза, които не съвпадат с този израз:

Необходима е известна практика, за да научите как да създавате и разбирате регулярни изрази. Въпреки това, след като усвоите регулярните изрази, вашиятмощна изразителна сила ще бъде на ваше разположение. Всичко това означава, че често е по-лесно да се използват регулярни изрази за решаване на проблем, който много добре би могъл да бъде разрешен с по-примитивни (и по-бързи) инструменти, като string модула.

Изтегляне на ресурси

Свързани теми

  • „Овладяване на регулярни изрази“ Стандартната и пълна препратка към регулярните изрази от Jeffrey E. F. Friedl (O'Reilly and Associates, 1997) .
  • Регулярни изрази в „документ с инструкции“ от Python.org.
  • „Общ преглед на регулярните изрази“ от Университета на Кентъки.
  • За подробно въведение в някои от по-ранните инструменти за текстообработка, които бяха много мощни и все още широко използвани, вижте "Sed & Awk" от Dale Dougherty и Arnold Robbins (O'Reilly and Associates, 1997).
  • Прочетете за инструментите за бързо манипулиране на текст "mxTextTools" за Python.

Коментари