Главная страница

Сам_себе_программист._Как_научиться_программировать_и_устроиться. Guide to Programming Professionally


Скачать 3.94 Mb.
НазваниеGuide to Programming Professionally
Дата25.02.2023
Размер3.94 Mb.
Формат файлаpdf
Имя файлаСам_себе_программист._Как_научиться_программировать_и_устроиться.pdf
ТипGuide
#954463
страница11 из 15
1   ...   7   8   9   10   11   12   13   14   15

Глава 16. bash
Я не могу представить себе работу, которую предпочел бы компьютерному программированию. Целый день из бесформенной пустоты вы создаете шаблоны и структуры, по пути решая десятки мелких головоломок.
Питер Ван Дер Линден
В этой главе вы научитесь пользоваться интерфейсом командной строки под на- званием bash . Интерфейс командной строки — это программа, в которую вы вво- дите инструкции для выполнения вашей операционной системой. bash — частный случай интерфейса командной строки, и он идет в комплекте с большинством
Unix-подобных операционных систем. Впредь я буду использовать термины «ин- терфейс командной строки» и «командная строка» как взаимозаменяемые.
Когда я получил свою первую работу программиста, я допустил ошибку, на- чав посвящать все свое время практике программирования. Конечно, чтобы программировать профессионально, вы должны быть талантливым программи- стом. Но у вас также должно быть множество других навыков — например, зна- ние командной строки. Командная строка — это «центр управления» всем, чем вы будете заниматься, не относящимся к написанию кода.
К примеру, позднее в этой книге вы узнаете, как пользоваться системами управления пакетами, чтобы устанавливать программы других людей, а также системами управления версиями для взаимодействия с другими программиста- ми. Вы будете управлять обоими этими инструментами из командной строки.
К тому же большинство современного программного обеспечения использует данные из всего Интернета, а большинство мировых веб-серверов работает под
Linux . У этих серверов нет пользовательских интерфейсов, вы можете пользо- ваться ими лишь посредством командной строки.
ЧАСТЬ III
Введение в инструменты
программирования

142
Часть III
Командная строка, системы управления пакетами, регулярные выражения и управление версиями — основные инструменты в арсенале программиста. Все, с кем я работал в команде, были экспертами в этих вещах.
Когда вы программируете профессионально, от вас ожидают, что помимо прочего вы будете хорошо ими владеть. У меня ушло много времени, чтобы по- нять это, и я жалею, что не начал изучение перечисленных методов раньше.
Выполнение примеров
Если вы пользуетесь Ubuntu или Unix, на вашем компьютере уже есть bash. Од- нако в операционной системе Windows вместо bash поставляется интерфейс
командная строка (Command Prompt), который нельзя использовать в этой главе. В 64-х разрядной версии Windows 10 с обновлением не ниже Anniversary
Update присутствует bash. Инструкции по использованию bash в Windows 10 можно найти на странице www.howtogeek.com/249966/how-to-install-and-use-
the-linux-bash-shell-on-windows-10/.
Если у вас другая версия Windows, можете использовать инфраструктуру
Amazon AWS для настройки бесплатного веб-сервера под Ubuntu. Операция по настройке сервера проста, а AWS широко используется в программистской сре- де, так что это снабдит вас ценным опытом. Для дополнительной информации посетите сайт aws.amazon.com/ru/getting-started/.
Если на вашем компьютере установлена операционная система Windows, но вы не хотите настраивать сервер, вы можете выполнять примеры в веб- приложении, эмулирующем bash. Ссылка на приложение находится по адресу
www.tutorialspoint.com/execute_bash_online.php.
В главах 17—18 вы сможете продолжать изучение, используя командную стро- ку Windows. Найти ее можно, введя команду cmd.exe в диалоговом окне Выпол-
нить (Run).
Запуск bash
Чтобы найти bash на компьютере, выполните поиск по запросу «терминал», щелкнув мышью по значку «Поиск на компьютере и в Интернете » (в Ubuntu), или при помощи поиска Spotlight (в macOS).
Команды
Интерфейс bash похож на оболочку Python. В bash вы набираете команды, ана- логичные функциям в Python. Затем вы вводите пробел и указываете параме- тры, которые хотите передать в команду (если они есть). Нажимаете клавишу
Enter, и bash возвращает результат. Команда echo похожа на функцию print в Python.

143
Введение в инструменты программирования
Всякий раз, когда в этой книге или документации вы видите символ $, за кото- рым следует команда, это значит, что в командную строку нужно ввести команду.
bash_ex01.sh
$ echo , !
>> , !
Сначала вы набрали в bash команду echo, пробел после нее и в качестве пара- метра — , !. Когда вы нажали клавишу Enter, в окне bash появилась строка , !.
Из командной строки можно использовать установленные вами программы
(например, Python). Введите команду python3 (веб-приложение bash не поддер- живает Python 3, поэтому введите python для использования Python 2).
bash_ex02.sh
$ python3
Теперь вы можете выполнять код Python.
bash_ex03.sh
print(", !")
>> , !
Введите команду exit(), чтобы выйти из Python.
Последние команды
В b ash можно просматривать последние команды, нажимая клавиши œ и . Для просмотра списка всех последних команд воспользуйтесь командой history.
bash_ex04.sh
$ history
Относительные и абсолютные пути
Операционная система состоит из каталогов и файлов. Каталог — синоним сло- ва «папка» . У всех каталогов и файлов есть путь — адрес каталога или файла в операционной системе. Когда вы используете bash, то всегда находитесь в ката- логе с конкретным путем. Для вывода имени вашего рабочего каталога восполь- зуйтесь командой pwd (сокращение от print working directory — вывод рабочего каталога). Рабочий каталог — это ваш текущий каталог.
bash_ex05.sh
$ pwd
>> /Users/coryalthoff

144
Часть III
Операционная система представляет свои каталоги, в том числе местонахож- дение вашего каталога, в виде дерева. В информатике «дерево» является важной концепцией, называемой «структура данных» (об этом поговорим в части IV).
В этом дереве корень располагается сверху. У корня есть ветви, у каждой из этих ветвей есть свои ветви, а у тех — свои, и так до бесконечности. Следующее изо- бражение служит примером дерева, представляющего каталоги в операционной системе.
Каждая ветвь дерева, включая корень, представляет каталог. Дерево демон- стрирует, как каталоги связаны друг с другом. При использовании bash вы на- ходитесь в определенном месте в дереве вашей операционной системы. Путь — способ представить это место. Есть два способа представить путь к файлу или каталогу в Unix-подобной операционной системе — абсолютный путь и относи-
тельный путь.
Абсолютный путь указывает на место файла или каталога начиная с корнево- го каталога. Абсолютный путь состоит из отделенных слешами имен каталогов в дереве в порядке приближения их к корню. Абсолютный путь к каталогу bernie
(см. рисунок выше) такой: /home/bernie. Первый слеш представляет корневой ка- талог, за ним следует каталог home, затем еще один слеш и каталог bernie.
Другим способом указания места на компьютере является относительный путь. Относительный путь начинается не с корневого каталога, а с текущего ра- бочего каталога. Если ваш путь не начинается со слеша, bash понимает, что вы используете относительный путь. Если бы вы находились в каталоге home (см. ри- сунок выше), относительный путь к каталогу projects был бы bernie/projects. Если бы вы находились в каталоге home, относительный путь к bernie был бы просто
bernie. Если бы вы находились в каталоге root, относительный путь к projects был бы home/bernie/projects.
Навигация
По каталогам можно перемещаться, передавая абсолютный или относительный путь в команду cd в качестве параметра. Введите команду cd, а после нее — абсо- лютный путь /, чтобы перейти в корневой каталог вашей операционной системы.
bash_ex06.sh
$ cd /
Узнать текущее местоположение можно при помощи команды pwd.

145
Введение в инструменты программирования
bash_ex07.sh
$ pwd
>> /
Команда ls выводит каталоги и папки в текущем рабочем каталоге.
bash_ex08.sh
$ ls
>> bin dev initrd.img lost+found ...
Вы можете создать новый каталог, передав имя желаемого каталога в команду mkdir
. Имена каталогов не должны содержать пробелы. Переместитесь в свой до- машний каталог (

— это сокращение для домашнего каталога в Unix-подобных опера- ционных системах) и используйте команду mkdir, чтобы создать новый каталог tstp.
bash_ex09.sh
$ cd
$ mkdir tstp
Проверьте создание каталога при помощи команды ls.
bash_ex10.sh
$ ls
>> tstp
Теперь используйте команду cd, чтобы перейти в каталог tstp: передайте в нее в качестве параметра относительный путь к каталогу tstp.
bash_ex11.sh
$ cd tstp
Чтобы перейти на один каталог выше (на один уровень выше по дереву), по- сле команды cd введите две точки.
bash_ex12.sh
$ cd ..
Каталог можно удалить при помощи команды rmdir
. Воспользуйтесь ею, чтобы удалить каталог tstp.
bash_ex13.sh
$ rmdir tstp
Наконец, удостоверьтесь, что каталог был удален при помощи команды ls.
bash_ex14.sh
$ ls

146
Часть III
Флаги
К командам применима концепция флаги, которая позволяет при выполнении команды изменять ее поведение. Флаги — это опции для команд, принимающие значения True или False. По умолчанию изначальное значение всех флагов —
False
. Если вы добавите флаг к команде, bash установит значение флага рав- ным True, и поведение команды изменится. Чтобы изменить флаг на True, перед его именем укажите один (-) или два (--) дефиса (количество дефисов за- висит от используемой операционной системы).
К примеру, вы можете добавить к команде ls флаг –author, чтобы присвоить флагу author значение True. Добавление этого флага к команде ls влияет на ее поведение. Когда вы добавляете этот флаг к команде ls, она выводит все каталоги и файлы в каталоге, но также выводит имя владельца — человека, их создавшего.
В Unix перед флагом добавляется один дефис.
bash_ex15.sh
$ ls –author
>> drwx------+ 13 coryalthoff 442B Sep 16 17:25 Pictures
>> drwx------+ 25 coryalthoff 850B Nov 23 18:09 Documents
А в Linux — два.
bash_ex16.sh
$ ls --author
>> drwx------+ 13 coryalthoff 442B Sep 16 17:25 Pictures
>> drwx------+ 25 coryalthoff 850B Nov 23 18:09 Documents
Скрытые файлы
Ваша операционная система, а также многие программы могут хранить данные в скрытых файлах. Скрытые файлы — это файлы, которые по умолчанию не вид- ны пользователю, поскольку их изменение может повлиять на программы, за- висящие от этих файлов. Имена скрытых файлов начинаются с точки, напри- мер .hidden. Скрытые файлы можно просмотреть, добавив флаг –a (от англ. слова
all — все) к команде ls.
Команда touch создает новый файл. Используйте ее для создания скрытого файла .self_taught.
bash_ex17.sh
$ touch .self_taught
Проверьте, отображается ли этот файл, при помощи команд ls и ls –a.
Вертикальная черта
В Unix-подобных операционных системах символ вертикальной черты (|) на-

147
Введение в инструменты программирования зывают «пайп». Вы можете использовать его для передачи вывода команды в другую команду в качестве ее ввода. Например, можно использовать вывод ко- манды ls в качестве ввода команды less (убедитесь, что не находитесь в пу- стом каталоге).
bash_ex18.sh
$ ls | less
>> Applications ...
Результатом будет текстовый файл с выводом ls, открытым в программе less
(введите символ q для выхода).
Переменные окружения
Переменные окружения хранятся в операционной системе и используют- ся программами для получения данных об окружении, в котором они работа- ют, — например, об имени компьютера, на котором запущена программа, или имени пользователя операционной системы, на которой она запущена. В bash новая переменная окружения создается при помощи синтаксиса export _
  = _  . Чтобы сослаться на переменную окруже- ния, нужно указать перед ее именем символ $.
bash_ex19.sh
$ export x=100
$ echo $x
>> 100
Переменная окружения, созданная таким образом, существует лишь в окне bash, в котором вы ее создали. Если вы закроете окно, в котором соз- дали переменную окружения, затем заново откроете его и введете команду echo $x
, bash не выведет 100, поскольку переменной окружения x больше не существует.
Вы можете сохранить переменную окружения, добавив ее в скрытый файл
.profile, расположенный в каталоге home в Unix-подобных операционных систе- мах. Воспользуйтесь своим графическим интерфейсом пользователя, чтобы по- пасть в домашний каталог. Путь к домашнему каталогу можно узнать, введя pwd

в командной строке. Воспользуйтесь текстовым редактором, чтобы создать файл .profile. Введите в первой строке файла export x=100 и сохраните его. За- кройте и заново откройте окно bash, и тогда вы сможете вывести переменную окружения x.
bash_ex20.sh
$ echo $x
>> 100

148
Часть III
Переменная будет сохранена до тех пор, пока будет содержаться в файле
.profile. Переменную можно удалить, стерев ее из файла .profile.
Пользователи
У операционных систем может быть множество пользователей. Пользователь — челов ек, использующий операционную систему. Каждому пользователю присво- ены имя пользователя (логин) и пароль, позволяющие ему заходить в операцион- ную систему и работать в ней. У каждого пользователя также есть определенные разрешения — набор операций, которые им позволено выполнять. При помо- щи команды whoami можно вывести имя пользователя операционной системы
(примеры в этом разделе не будут работать в веб-приложении bash).
$ whoami
Обычно вы и есть тот пользователь, аккаунт которого создали при установ- ке операционной системы. Но полномочия такого пользователя не самые ши- рокие. Пользователь с наивысшим уровнем разрешений называется пользовате- лем с правами root (пользователем root, суперпользователем). В каждой системе есть суперпользователь, который, к примеру, может создавать и удалять аккаун- ты других пользователей.
По соображениям безопасности обычно вы не входите в систему как супер- пользователь. Вместо этого перед командами, которые вы хотите выполнить как суперпользователь, вы добавляете команду sudo (от англ. словосочетания superuser do — выполняет суперпользователь). Ключевое слово sudo позволяет выполнять команды от имени суперпользователя без необходимости входа в акка- унт суперпользователя, нанося ущерб безопасности вашей операционной систе- мы. Ниже приведен пример использования команды echo с командой sudo.
$ sudo echo , !
>> , !
Если на вашем компьютере установлен пароль, вам будет предложено его ввести, когда вы используете команду с sudo. Команда sudo снимает защитные меры, которые оберегают операционную систему от нанесения вреда, поэтому никогда не выполняйте команду с sudo, если вы до конца не уверены, что эта ко- манда не навредит вашей операционной системе.
Узнайте больше
В этой главе были описаны лишь основы bash. Чтобы узнать больше об использо- вании bash, прочитайте статью по адресу habrahabr.ru/post/47163/.
Словарь терминов
$PATH
: когда вы вводите команду в bash, оболочка ищет эту команду во всех ката- логах, хранящихся в переменной окружения $PATH.
bash: программа, встроенная в большинство Unix-подобных операционных систем, в которую вы вводите инструкции для выполнения вашей операционной системой.

149
Введение в инструменты программирования
Абсолютный путь: указывает на расположение файла или каталога, начиная с корневого каталога.
Вертикальная черта: символ |. В Unix-подобных операционных системах вы можете использовать его для передачи вывода команды в другую команду в каче- стве ее ввода.
Интерфейс командной строки: программа, в которую вы вводите инструкции для выполнения вашей операционной системой.
Каталог: другое название папки на компьютере.
Командная строка (в Windows): интерфейс командной строки, встроенный в операционную систему Windows.
Командная строка: другое название интерфейса командной строки.
Относительный путь: указывает на расположение файла или каталога, начиная с текущего рабочего каталога.
Переменные окружения: переменные, в которых хранит данные операцион- ная система, а также другие программы.
Пользователь: человек, пользующийся операционной системой.
Путь: способ представить место файла или каталога в операционной системе.
Рабочий каталог: текущий каталог, в котором вы находитесь.
Разрешения: операции, которые разрешено выполнять пользователям.
Суперпользователь (пользователь с правами root): пользователь с наивысшим уровнем полномочий.
Практикум
1. Выведите в bash Self-taught.
2. Переместитесь в свой домашний каталог из другого каталога, используя аб- солютный и относительный путь.
3. Создайте переменную окружения $python_projects, являющуюся аб- солютным путем к каталогу, где находятся ваши файлы Python. Сохраните переменную в файле .profile, а затем воспользуйтесь командой cd $python_
projects
, чтобы попасть туда.
Решения: challenge1.sh — challenge3.sh.
Глава 17. Регулярные выражения
Болтовня ничего не стоит. Покажите мне код.
Линус Торвальдс
Многие языки программирования и операционные системы поддерживают
регулярные выражения — «последовательности символов, определяющие по- исковый шаблон»
12
. Регулярные выражения могут быть полезны благодаря тому, что их можно использовать для выполнения поиска по сложным запросам в фай- лах или иных данных. К примеру, вы можете использовать регулярное выраже- ние для поиска всех чисел в файле. В этой главе вы научитесь определять и пе- редавать регулярные выражения команде grep
, используемой в Unix-подобных
12
ru.wikipedia.org/wiki/ _ 

150
Часть III
операционных системах, которая ищет совпадения в файле и возвращает най- денный текст, соответствующий шаблону. Вы также научитесь использовать ре- гулярные выражения для поиска по шаблону в строках в Python.
Настройка
Для начала создайте файл zen.txt. В командной строке (убедитесь, что вы находи- тесь в каталоге с файлом zen.txt) введите команду python3 –c "import this".
Команда выведет текст поэмы «Дзен Пайтона» Тима Питерса. Ниже показан ее перевод на русский язык.
Дзен Пайтона
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один — и, желательно, только один — очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец.
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имен — отличная штука! Будем делать их побольше!
Флаг –c сообщает Python, что вы собираетесь передать строку, содержа- щую код Python. Затем Python выполняет код. Результатом выполнения строки import this становится вывод текста «Дзен Пайтона» (сообщение, спрятан- ное в коде, вроде этой философии, называется пасхальным яйцом). Введите в bash команду exit(), чтобы выйти из Python. Используйте документ zen.txt, при- лагаемый в качестве файлов примеров для этой книги.
По умолчанию в Ubuntu команда grep выводит совпавшие слова, подсвечи- вая их красным цветом, но в Unix этого не происходит. Если вы работаете в сре- де macOS, то можете изменить это поведение, установив в bash следующие пере- менные окружения:
bash_ex21.sh
$ export GREP_OPTIONS='--color=always'
$ export GREP_OPTIONS='--color=always'

151
Введение в инструменты программирования
Запомните, что установка переменных окружения в bash происходит на временной основе, так что если вы завершите работу bash, вам придется на- страивать переменные окружения заново при следующем запуске. Вы можете добавить переменные окружения в ваш файл .profile, чтобы сохранить их на по- стоянной основе.
Простое совпадение
Команда grep принимает два параметра — регулярное выражение и путь к файлу для поиска содержимого по шаблону, определенному в регулярном выражении.
Простейшим видом шаблона является простое совпадение, строка слов, совпа- дающая с такой же строкой слов. Чтобы увидеть пример простого совпадения, введите следующую команду в каталоге, в котором вы создали файл zen.txt.
bash_ex22.sh
$ grep    zen.txt
>>    *,    .
В выполненной вами команде первый параметр,   , — это регуляр- ное выражение, а второй параметр, zen.txt, — путь к файлу, в котором нужно искать регулярное выражение. Программа bash вывела строку    -
*,    
и выделила слово    красным цветом шрифта, по- скольку это то слово, которое совпало с регулярным выражением.
Если в предыдущем примере вы измените регулярное выражение    на   , команда grep не найдет совпадения.
bash_ex23.sh
$ grep    zen.txt
Чтобы не учитывать регистр букв, добавьте флаг –i.
bash_ex24.sh
$ grep -i    zen.txt
>>    *,    .
По умолчанию команда grep выводит всю строку файла, в котором она на- шла совпадение. Чтобы выводить только конкретные слова, совпадающие с пе- реданным шаблоном, добавьте флаг –o.
bash_ex25.sh
$ grep -o    zen.txt
>>   
Вы можете использовать регулярные выражения в Python при помощи встро- енной библиотеки re (от англ. словосочетания regular expressions — регулярные выражения). В модуле re есть метод  ndall. В качестве параметров в него пере-

152
Часть III
дается регулярное выражение, затем строка, и он возвращает список со всеми элементами в строке, которые совпадают с шаблоном.
Python_ex275.py
1
import re
2
l
= "    *,    ."
3
matches
= re. ndall("   ", l)
4
print(matches)
>> ['   ']
В этом примере метод  ndall нашел совпадение и вернул список с совпаде- нием (Красивое) в качестве первого элемента.
Вы можете не учитывать регистр в методе  ndall. Для этого передайте в него значение re.IGNORECASE в качестве третьего параметра .
Python_ex276.py
1
import re
2
l
= "    *,    ."
3
matches
= re. ndall("  ",
4
l,
5
re.IGNORECASE)
6
print(matches)
>> ['   ']
Совпадение в начале и в конце
Вы можете создавать регулярные выражения со сложными шаблонами, доба- вив в них особые символы, которые не используются для поиска совпадения, а определяют правило. Например, для создания регулярного выражения, которое ищет шаблон, только если он встречается в начале строки, можно использовать символ каретки (^).
bash_ex26.sh
$ grep ^Πzen.txt
>> Π B   W  .
>> Œ  B YW  & ‘  —   G .
>> Œ  B YW  ‘  — ,  B & , G  * .

153
Введение в инструменты программирования
Аналогично можно использовать символ доллара ($), чтобы искать совпаде- ния только в конце строки.
bash_ex27.sh
$ grep   .$ zen.txt
>> %  *,    .
В этом случае команда grep проигнорировала строки *   
 &  B   .
и     B  W *,  
 .
, так как они хоть и содержат слово никогда, но не заканчиваются им.
Ниже приведен пример использования символа каретки (^) в Python (вы должны передать значение re.MULTILINE в качестве третьего параметра мето- ду  ndall, чтобы искать совпадения во всех строках многострочного экрана).
Python_ex277.py
1
import re
2
zen
= """
    B  W
3
*,    .
4
Π B YW  &
5
‘  —   G .
6
Œ  B YW  ‘ 
7
— ,  B & , G  * .
8
    —  
9
* ! ‚   G   *!
10
"""
11
m
= re. ndall("^Œ",
12
zen,
13
re.MULTILINE)
14
print(m)
>> ['Œ', 'Œ']
Поиск совпадений с несколькими символами
Чтобы определить шаблон для поиска совпадений с несколькими символами, по- местите эти символы внутрь квадратных скобок в регулярном выражении. Если вы укажете значение [ ], регулярное выражение будет искать совпадения с ,

или . В следующем примере вместо поиска совпадений в вашем файле zen.txt, вы будете искать их в строке, которую добавите к команде grep при помощи верти- кальной черты.

154
Часть III
bash_ex28.sh
$ echo   . | grep -i [ ]
>>  
Вывод команды echo передается в grep в качестве ввода и, следовательно, вам не нужно указывать файл в качестве параметра для grep. Команда выводит и  , и  , поскольку регулярное выражение находит совпадение с буквой , затем либо с , либо с , и затем — с .
В Python это делается так:
Python_ex278.py
1
import re
2
string
= "   ."
3
m
= re. ndall("[ ] ",
4
string,
5
re.IGNORECASE)
6
print(m)
>> [' c, ' ']
Совпадения цифр
С помощью значения [[:digit:]] можно искать совпадения цифр.
bash_ex29.sh
$ echo 123 G  34 . | grep [[:digit:]]
>> 123 G  34 .
В Python для этого используют ся символы \d.
Python_ex279.py
1
import re
2
line
= "123?34 ?"
3
m
= re. ndall("\d",
4
line,
5
re.IGNORECASE)
6
print(m)
>> ['1', '2', '3', '3', '4']

155
Введение в инструменты программирования
Повторение
Символ звездочки (*) добавляет в регулярные выражения повторение. При его помощи «предшествующий элемент будет найден ноль или более раз»
13
. К при- меру, используя звездочку, можно найти совпадения с , за которым следует лю- бое количество букв .
bash_ex30.sh
$ echo    . | grep -o *
>> 
>> 
В регулярных выражениях точка соответствует любому символу. Если вы ука- жете звездочку после точки, будет выполняться поиск совпадения с любым сим- волом ноль или более раз. Можно использовать точку со звездочкой для поиска всего, что находится в промежутке между двумя символами.
bash_ex31.sh
$ echo ____ | grep -o __.*__
>> ____
Регулярное выражение __.*__ находит все символы между двумя двойными подчеркиваниями , включая сами подчеркивания. Символ звездочки является жад-
ным — это значит, что он попытается найти столько текста, сколько сможет. Если вы добавите больше слов с двойными подчеркиваниями, регулярное выражение из предыдущего примера найдет все от первого до последнего подчеркивания.
bash_ex32.sh
$ echo ____  __ __! | grep -o __.*__
>> ____  __ __
Не всегда нужно искать шаблоны жадным образом. Чтобы сделать регуляр- ное выражение нежадным , можно указать после звездочки вопросительный знак. Нежадное регулярное выражение ищет наименьшее возможное количе- ство совпадений. В данном случае такое выражение остановилось бы на первом двойном подчеркивании, а не продолжило бы искать совпадения между самым первым и самым последним подчеркиваниями. Для команды grep недоступен нежадный поиск, но в Python для этого можно использовать знак вопроса.
Python_ex280.py
1
import re
2
t
= "__  __ __ __ ____"
3
found
= re. ndall("__.*?__", t)
13
tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_01.html

156
Часть III
4
for match in found:
5
print(match)
>> __  __
>> __ __
>> ____
С помощью «нежадного» поиска на Python можно создать игру «Чепуха» (на- помню, что это игра, где игроку предлагается вставить пропущенные в абзаце текста слова).
Python_ex281.py
1
import re
2
text
= """Ž ƒ W   
3
 B  __%|¡Œ%KRKŒ$Œ  V$ŽŒ%KŒ$$V HR%Œ__
4
Y    . Ž ƒ
5
 &   ,    W
6
   __%|¡Œ%KRKŒ$Œ  V$ŽŒ%KŒ$$V HR%Œ__,
7
     G  
8
  __H%K_KŒ__. Œ &
9
& ƒ G  __HR%__
10
__%|¡Œ%KRKŒ$Œ  V$ŽŒ%KŒ$$V HR%Œ__, 
11
G        __H%K KŒ__.
12
"""
13
def mad_libs(mls):
14
"""
15
:param mls:   G
16
 B    
17
 &  &   
18
  .   
19
B      B:
20
__  B _  B __ ( B);
21
__  B __ ( & ).
22
"""
23
hints
= re. ndall("__.*?__",
24
mls)
25
if hints is not
None
:
26
for word in hints:
27
q
= " {}".format(word)

157
Введение в инструменты программирования
28
new
= input(q)
29
mls
= mls.replace(word, new, 1)
30
print('\n')
31
mls
= mls.replace("\n", "")
32
print(mls)
33
else: print(" *   ")
34
mad_libs(text)
>>  __%|¡Œ%KRKŒ$Œ  V$ŽŒ%KŒ$$V HR%Œ__
В данном примере вы используете метод re. ndall, чтобы получить список всех слов в переменной text, окруженных двойными подчеркиваниями (каж- дое из них подсказывает тип необходимого слова). Затем вы перебираете список и используете каждую подсказку, предлагая пользователю программы вставить новое слово. После этого вы создаете новую строку, заменяя подсказку встав- ленным пользователем словом. Как только цикл завершается, выводится новая строка со всеми словами, полученными от пользователя.
Управляющие символы
В регулярных выражениях вы можете экранировать символы (игнорировать их значение, просто находя совпадения) так же, как вы делали в случае со строками в Python, указывая обратный слеш \ перед регулярным выражением.
bash_ex33.sh
$ echo Q WW $ | grep \$
>> Q WW $
Обычно символ $ означает, что совпадение допустимо, только если оно на- ходится в конце строки, но поскольку вы экранировали этот знак, регулярное выражение просто найдет совпадение.
Этот же пример в Python:
Python_ex282.py
1
import re
2
line
= "Q WW $"
3
m
= re. ndall("\\$",
4
line,
5
re.IGNORECASE)
6
print(m)
>> ['$']

158
Часть III
Инструмент для создания регулярных выражений
Процесс создания регулярного выражения для поиска шаблона может отни- мать много сил. Посетите сайты regexr.com и www.tutorialspoint.com/python/
python_reg_expressions.htm и познакомьтесь с инструментами, которые помо- гут вам создавать идеальные регулярные выражения.
Словарь терминов
Жадный: регулярное выражение, которое будет с жадностью пытаться найти столько совпадений, сколько сможет.
Нежадный: нежадное регулярное выражение находит наименьшее количество совпадений.
Пасхальное яйцо: сообщение, спрятанное в коде.
Регулярное выражение: «последовательность символов, определяющая поис- ковый шаблон»
14
Практикум
1. Напишите регулярное выражение, которое находит слово   Y в
«Дзене Пайтона».
2. Создайте регулярное выражение, которое находит все цифры в строке V -
 : 777, 999, 797. K : 071, 950, 112.
3. Создайте регулярное выражение для нахождения любого слова, которое на- чинается с произвольного символа, предшествующего буквам  . Затем ис- пользуйте модуль re из Python, чтобы найти сочетания  и B в предло- жении    **    B  .
Решения: challenge_1.sh, challenge_2.sh, challenge_3.py и zen.txt.
1   ...   7   8   9   10   11   12   13   14   15


написать администратору сайта