world.py:
import re
def a(): pass
b = 42
_c = []
__d__ = {}
Кои имена ще са достъпни през модула при import world?
import games.chess games.chess.play()
Какво трябва да е налице за да работи този код?
Каква е разликата между
import baba
и
from . import baba
Какво се импортира при:
from world import *
Работа с низове:
Това означава:
- Трябва да съдържа само цифри
- Може да започва с код на населеното място: `02`, `032` или `052`
- След кода, дължината му може да е между 5 и 7 цифри
- Самият номер (след кода) не може да започва с 0, 1, 2, 3 или 4
def validate_phone_str(number):
if '02' == number[:2]:
return validate_phone_str(number[2:])
elif number[:3] in {'032', '052'}:
return validate_phone_str(number[3:])
if all([c.isdigit() for c in number]):
return 5 <= len(number) <= 7
return False
def validate_phone_re(number):
pattern = r'^(02|032|052)?[5-9]\d{4,6}$'
return bool(re.search(pattern, number))
Да се провери дали дадено число е просто чрез един ред пайтън-код и регулярен израз. Разрешени операции са:
- Самото число, разбира се.
re.searchс подходящ шаблон.- Употребата на низа '1'.
- Операторa
*.
Решения — по-късно.
import re — модулът, реализиращ PCRE-функционалността\r'\s+'. | ( ) [ ] { } + \ ^ $ * ?
\ пред специален символ го прави неспециален такъв. matchermatcher().matcher(pattern, string).
>>> matcher('pat', 'Find a pattern.')
'Find a pattern.'
>>> matcher('#', 'What ###?')
'What ###?'
Важат за непосредствено предхождащия ги символ/клас/група. Нека го означим с s.
s* означава нула или повече повторения на s. s+ търси едно или повече повторения на s. s? съвпада с нула или едно повторение на s. s{m,n} означава между m и n повторения на s, където можем да пропуснем m или n. s{,n} има смисъл на
нула до n повторения, а s{m,} — поне m повторения.`
Символите ( и ) се използват за логическо групиране на части от шаблона с цел:
Повече за групите — след малко.
matcher('o+', 'Goooooooogle') # 'Goooooooogle'
matcher('[hH]o+', 'Hohohoho...') # 'Hohohoho...'
# Хм. Не искахме точно това. По-скоро:
matcher('([hH]o)+', 'Hohohoho...') # 'Hohohoho...'
matcher('([hH]o){2,3}', 'Hohohoho...') # 'Hohohoho...'
По подразбиране — алчно търсене за съвпадение (greedy). Деактивира се с `?` след квантора.
matcher('[hH]o+', 'Hoooooohohooo...') # 'Hoooooohohooo...'
matcher('[hH]o+?', 'Hoooooohohooo...') # 'Hoooooohohooo...'
. съвпада с един произволен символ. По подразбиране символите за нов ред не се включват в тази група. ^ съвпада с началото на низ (или на ред, ако се работи в MULTILINE режим.) $ съвпада с края на низ (или на ред, ако се работи в MULTILINE режим.) | има смисъл на или, например:
matcher('day|nice', 'A nice dance-day.') # 'A nice dance-day.'
matcher('da(y|n)ce', 'A nice dance-day.') # 'A nice dance-day.'
NB! Единствено | се прилага не над непосредствените му символи/класове, а на целия низ отляво/отдясно:
matcher('ab|c|e', 'abcdef') # 'abcdef'
matcher('am|c|e', 'abcdef') # 'abcdef'
matcher('a(m)|c|e', 'abcdef') # 'abcdef'
[ и ], например [aeoui].
>>> matcher('[aeoui]', 'Google')
'Google'
^ в началото на класа:
matcher('[^CBL][aeoui]', 'Cobol') # 'Cobol'
>>> matcher('[0-9]{1,3}-[a-z]', 'Figure 42-b')
'Figure 42-b'
>>> matcher('[^a-zA-Z-]', 'Figure-42-b')
'Figure-42-b'
\d — една цифра; същото като [0-9]. \D — един символ, който не е цифра; същото като [^0-9]. \s — един whitespace символ — [\t\r\n\f\v]. \S — един символ, който не е whitespace — [^\t\r\n\f\v]. \w — една буква или цифра. \W — един символ, който не е буква или цифра. \b — нула символа, но граница на дума. matcher(r'\d+', 'Phone number: 5551234') # 'Phone number: 5551234' matcher(r'\w+', 'Phone number: 5551234') # 'Phone number: 5551234' matcher(r'\s+', 'Phone number: 5551234') # 'Phone number: 5551234'
( и ). \1 — първата група, \2 — втората и така нататък. matcher(r'(\w+).*\1', 'Matches str if str repeats one of its words.'); 'Matches str if str repeats one of its words.' # Хм. Не точно. Нека опитаме пак: matcher(r'(\b\w+\b).*\1', 'Matches str if str repeats one of its words.'); 'Matches str if str repeats one of its words.'
(?:…) — използване на скоби, без да се създава група. (?P…) — текстът, отговарящ на групата, може да бъде достъпван чрез име, вместо чрез номер. (?P=name) — търси съвпадение за текста, намерен по-рано от групата, кръстена name. (?#…) — коментар, игнорира се. (?=…) — съвпада, ако … следва, но не го „консумира“ (look-ahead). (?!…) — съвпада, ако … не следва. (?(id/name)yes|no) — търси за шаблона 'yes', ако групата с номер/име съвпада, или с (опционалния) шаблон 'no' иначе. help(re)rere.search() — проверява дали даден низ съдържа текст, отговарящ на зададения шаблонre.match() — същото както горното, само че се търси за съвпадение в началото на низаre.findall() — връща като списък всички съвпадения на шаблона в дадения низre.finditer() — същото като горното, но връща итераторre (2)re.sub(pattern, repl, string, count=0) — заместване в низ, на база на шаблонre.split(pattern, string, maxsplit=0) — разделяне на низ на парчета, на база на шаблонre.escape(pattern) — escape-ва всички специални за регулярен израз символиre.escape('a(a)\s+') ще върне 'a\\(a\\)\\\\s\\+'help(re) MatchObjectgroup() — връща частта от низа, отговаряща на шаблона (и още…) start() — връща началото на съвпадението в низаend() — връща края на съвпадението в низаspan() — връща (start, end) под формата на tuplere.I (re.IGNORECASE) — case-insensitive търсене. re.L (re.LOCALE) — кара \w, \W, \b, \B да зависят от текущия locale. re.M (re.MULTILINE) — кара „^“ да съвпада както с начало на низ, така и с начало на ред, докато „$“ ще съвпада с край на ред или края на низа. re.S (re.DOTALL) — „.“ ще съвпада с всеки символ, включително и нов ред. re.X (re.VERBOSE) — режим на игнориране на white-space и коментари (за по-дългички RE). re.А (re.ASCII) — кара \w, \W, \b, \B, \d, \D да отговарят на съответните ASCII-класове. matcher()
def matcher(regex, string):
match = re.search(regex, string)
if match is None: return string
start, end = match.span()
return string[:start]
+ '<<<' + string[start:end] + '>>>' +
string[end:]
'prime' if not re.search(<някакъв шаблон>, '1' * <число>) else 'not prime' r'^1?$|^(11+?)\1+$'. Въпроси?