• Nie Znaleziono Wyników

Przetwarzanie tekstu: wyrażenia regularne, html, xml

N/A
N/A
Protected

Academic year: 2021

Share "Przetwarzanie tekstu: wyrażenia regularne, html, xml"

Copied!
66
0
0

Pełen tekst

(1)

Kurs rozszerzony języka Python

Wykład 5.

Marcin Młotkowski

(2)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a

Plan wykładu

1 Wyrażenia regularne Wprowadzenie Grupowanie wyrażeń 2 Przetwarzanie html’a HTMLParser BeautifulSoup 3 Przetwarzanie XML’a

(3)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Plan wykładu

1 Wyrażenia regularne Wprowadzenie Grupowanie wyrażeń 2 Przetwarzanie html’a HTMLParser BeautifulSoup 3 Przetwarzanie XML’a

(4)

Wyrażenia regularne

Przetwarzanie html’a Przetwarzanie XML’a

Wprowadzenie Grupowanie wyrażeń

Przykłady wyrażeń regularnych

W systemie windows

c:\WINDOWS\system32> dir *.exe Wynik accwiz.exe actmovie.exe ahui.exe alg.exe append.exe arp.exe asr fmt.exe, asr ldm.exe ...

(5)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Przykłady, cd

?N*X, *BSD $ rm *.tmp

Przykłady wyrażeń regularnych

wyr. reg. zbiór słów

”alamakota” { ’alamakota’ }

”(hop!)*” { ”, ’hop!’, ’hop!hop!’, ’hop!hop!hop!’, ...}

(6)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Wyszukwanie a dopasowywanie

biblioteka re importre

dopasowanie od początku tekstu

if re.match(”brr+um”,”brrrrum!!!”): print(”pasuje”) Niepasujący suffiks może być zignorowany.

wyszukiwanie

if re.search(”brr+um”,”Autko robi brrrrum!!!”): print(”jest”)

(7)

Wyrażenia regularne

Przetwarzanie html’a Przetwarzanie XML’a

Wprowadzenie Grupowanie wyrażeń

Kompilowanie wyrażeń regularnych

importre

automat = re.compile(”brr+um”)

automat.search(”brrrrum”)

(8)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Interpretacja wyniku

>>> re.search(”brr+um”,”brrrum!!!”) MatchObject

.group(): dopasowany tekst

.start(): początek dopasowanego tekstu .end(): koniec dopasowanego tekstu

(9)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Większy przykład

Zadanie

Znaleźć na stronie html’owej wszystkie odwołania do innych stron przykłady

www.ii.uni.wroc.pl ii.yebood.com

(10)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie zadania

Implementacja adres =”([a-zA-Z]+\.)*[a-zA-Z]+”

automat = re.compile(”http://” + adres)

tekst = str(fh.read())

[ url.group()for url in automat.finditer(tekst) ]

(11)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie zadania

Implementacja adres =”([a-zA-Z]+\.)*[a-zA-Z]+”

automat = re.compile(”http://” + adres)

tekst = str(fh.read())

(12)

Wyrażenia regularne

Przetwarzanie html’a Przetwarzanie XML’a

Wprowadzenie Grupowanie wyrażeń

Podręczne zestawienie metaznaków

znak opis

w * wystąpienie 0 lub więcej razy w

w + wystąpienie co najmniej raz w

w {m, n} w występuje przynajmniej m razy, a co najwyżej

n razy

w ? 0 lub 1 wystąpienie w

w1|w2 alternatywa znaków w1 i w2

. dowolny znak oprócz znaku nowego wiersza

[aeiouy ] pojedyncza samogłoska

[A − Z ] wielka litera

(13)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Popularne skróty

znak opis \d dowolna cyfra

\w znak alfanumeryczny (zależy od LOCALE)

(14)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Problem z ukośnikiem

Rola ukośnika w Pythonie

”Imię\tNazwisko\n”

print(”Tabulator to znak \\t”)

”c:\\WINDOWS\\win.ini”

(15)

Wyrażenia regularne

Przetwarzanie html’a Przetwarzanie XML’a

Wprowadzenie Grupowanie wyrażeń

Ukośnik a wyrażenia regularne

Wyszukiwanie ’[’ re.match(”\[”,”[”)

Zagadka

(16)

Wyrażenia regularne

Przetwarzanie html’a Przetwarzanie XML’a

Wprowadzenie Grupowanie wyrażeń

Ukośnik a wyrażenia regularne

Wyszukiwanie ’[’ re.match(”\[”,”[”) Zagadka

Jak znaleźć w tekście”\[”?

(17)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Próby rozwiązania

’\[’

re.match(’\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\[”,”[”) # wynik: None

’\\[’

re.match(’\\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\\[”,”[”) # wynik: None

re.match(’\\\[’, ’\[’) # wynik: None

(18)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Próby rozwiązania

’\[’

re.match(’\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\[”,”[”) # wynik: None

’\\[’

re.match(’\\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\\[”,”[”) # wynik: None

re.match(’\\\[’, ’\[’) # wynik: None

re.match(’\\\\[’, ’\[’) # wynik: None

(19)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Próby rozwiązania

’\[’

re.match(’\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\[”,”[”) # wynik: None

’\\[’

re.match(’\\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\\[”,”[”) # wynik: None

re.match(’\\\[’, ’\[’) # wynik: None

(20)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Próby rozwiązania

’\[’

re.match(’\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\[”,”[”) # wynik: None

’\\[’

re.match(’\\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\\[”,”[”) # wynik: None

re.match(’\\\[’, ’\[’) # wynik: None

re.match(’\\\\[’, ’\[’) # wynik: None

(21)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Próby rozwiązania

’\[’

re.match(’\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\[”,”[”) # wynik: None

’\\[’

re.match(’\\[’, ’\[’) # błąd kompilacji wyrażenia regularnego

re.match(”\\[”,”[”) # wynik: None

re.match(’\\\[’, ’\[’) # wynik: None

(22)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Poprawne rozwiązanie

Rozwiązanie re.match(’\\\\\[’, ’\[’) re.match(r’\\\[’, ’\[’)

(23)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Przetwarzanie znaków

Przetwarzanie stringów na poziomie Pythona

string w Pythonie znak ’prawdziwy’

’\n’ 0x0A

’\t’ 0x0B

’\\’ 0x5C

Przetwarzanie stringów na poziomie wyrażeń regularnych

string w wyrażeniu regularnym znak ’prawdziwy’

(24)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Trochę o grupach

res = re.match(”a(b*)a.*(a)”,”abbabbba”)

print(res.groups()) Wynik

(’bb’, ’a’)

(25)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Wyrażenia grupujące

(?P<nazwa>regexp)

(26)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Zadanie

Z daty w formacie ’20171103’ wyciągnąć dzień, miesiąc i rok.

(27)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie

Wyrażenie regularne wzor = ’(?P<rok>\d{4})(?P<mies>\d{2})(?P<dzien>\d{2})’

res = re.search(wzor,”W dniu 20191105 jest wykład z Pythona”)

(28)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie

Wyrażenie regularne

wzor = ’(?P<rok>\d{4})(?P<mies>\d{2})(?P<dzien>\d{2})’

res = re.search(wzor,”W dniu 20191105 jest wykład z Pythona”)

print(res.group(”rok”), res.group(”mies”))

(29)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie

Wyrażenie regularne

wzor = ’(?P<rok>\d{4})(?P<mies>\d{2})(?P<dzien>\d{2})’

res = re.search(wzor,”W dniu 20191105 jest wykład z Pythona”)

(30)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie

Wyrażenie regularne

wzor = ’(?P<rok>\d{4})(?P<mies>\d{2})(?P<dzien>\d{2})’

res = re.search(wzor,”W dniu 20191105 jest wykład z Pythona”)

print(res.group(”rok”), res.group(”mies”))

(31)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie

Wyrażenie regularne wzor = ’(?P<rok>\d{4})(?P<mies>\d{2})(?P<dzien>\d{2})’

res = re.search(wzor,”W dniu 20191105 jest wykład z Pythona”)

(32)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiązanie

Wyrażenie regularne wzor = ’(?P<rok>\d{4})(?P<mies>\d{2})(?P<dzien>\d{2})’

res = re.search(wzor,”W dniu 20191105 jest wykład z Pythona”)

print(res.group(”rok”), res.group(”mies”))

(33)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Zamiana tekstu

(34)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a Wprowadzenie Grupowanie wyrażeń

Rozwiazanie

importre wzor =’(?P<rok>\d{4})-(?P<mies>\d{2})-(?P<dzien>\d{2})’ defzamieniacz(match):

returnmatch.group(’dzien’) +’-’+ match.group(’mies’) +’-’+ match.group(’rok’)

tekst =”Bitwa pod Grunwaldem miała miejsce 1410-07-15”

dmr = re.sub(wzor, zamieniacz, tekst)

’Bitwa pod Grunwaldem miała miejsce 15-07-1410’

(35)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Plan wykładu

1 Wyrażenia regularne Wprowadzenie Grupowanie wyrażeń 2 Przetwarzanie html’a HTMLParser BeautifulSoup 3 Przetwarzanie XML’a

(36)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Przetwarzanie html’a

Plik html to ciąg znaczników <html> <title>Tytuł</title> <body bgcolor=”red”> <div align=”center”>Tekst</div> </body> </html> Tagi otwierające <html>, <body>, <div> Tagi zamykające </body>, </div>, </html>

(37)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Klasa html.parser.HTMLParser

classhtml.parser.HTMLParser:

defhandle starttag(self, tag, attrs):

defhandle startendtag(self, tag, attrs):

defhandle endtag(self, tag):

defhandle data(self, dane): ...

Do uruchomienia parsera służy metoda feed:

defhandle endtag(self, data)

(38)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Klasa html.parser.HTMLParser

classhtml.parser.HTMLParser:

defhandle starttag(self, tag, attrs):

defhandle startendtag(self, tag, attrs):

defhandle endtag(self, tag):

defhandle data(self, dane): ...

Do uruchomienia parsera służy metoda feed:

defhandle endtag(self, data)

Lista attrs jest listą krotek (nazwa atrybutu, wartość atrybutu).

(39)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Przykład

Wypisać wszystkie odwołania ’href’ <a href="adres">Tekst</a>

importhtml.parser

classMyHTMLParser(html.parser.HTMLParser):

def handle starttag(self, tag, attrs):

iftag == ’a’:

for (atr, val) in attrs:

if atr == ’href’: print(val) myparser = MyHTMLParser()

withopen(”python.html”) as data:

(40)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Przykład

Wypisać wszystkie odwołania ’href’ <a href="adres">Tekst</a>

importhtml.parser

classMyHTMLParser(html.parser.HTMLParser):

defhandle starttag(self, tag, attrs):

iftag == ’a’:

for (atr, val) in attrs:

if atr == ’href’: print(val) myparser = MyHTMLParser()

withopen(”python.html”) as data:

myparser.feed(data.read())

(41)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Co to takiego

(42)

Wyrażenia regularne

Przetwarzanie html’a

Przetwarzanie XML’a

HTMLParser BeautifulSoup

Jak jej używać

importbs4 bs = bs4.BeautifulSoup(tekst html,’html.parser’) print(bs.title) # <title>Tytuł</title> print(bs.title.name) # Tytuł print(bs.title.parent.name) # head

(43)

Wyrażenia regularne

Przetwarzanie html’a

Przetwarzanie XML’a

HTMLParser BeautifulSoup

Jak jej używać

importbs4 bs = bs4.BeautifulSoup(tekst html,’html.parser’) print(bs.title) # <title>Tytuł</title> print(bs.title.name) # Tytuł print(bs.title.parent.name) # head

(44)

Wyrażenia regularne

Przetwarzanie html’a

Przetwarzanie XML’a

HTMLParser BeautifulSoup

Jak jej używać

importbs4 bs = bs4.BeautifulSoup(tekst html,’html.parser’) print(bs.title) # <title>Tytuł</title> print(bs.title.name) # Tytuł print(bs.title.parent.name) # head

(45)

Wyrażenia regularne

Przetwarzanie html’a

Przetwarzanie XML’a

HTMLParser BeautifulSoup

Jak jej używać

importbs4 bs = bs4.BeautifulSoup(tekst html,’html.parser’) print(bs.title) # <title>Tytuł</title> print(bs.title.name) # Tytuł print(bs.title.parent.name) # head

(46)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Wyszukiwanie tagów

bs.find all(’a’)

Lista w postaci <a href="..."> ... </a>

forlinkin bs.find all(’a’): print(link.get(’href’))

(47)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Wyszukiwanie tagów

bs.find all(’a’)

Lista w postaci <a href="..."> ... </a>

forlinkin bs.find all(’a’): print(link.get(’href’))

(48)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a HTMLParser BeautifulSoup

Wyszukiwanie po atrybutach

bs.find all(’img’, {’src’ : re.compile(’.*thumbnail.*’) })

(49)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a

Plan wykładu

1 Wyrażenia regularne Wprowadzenie Grupowanie wyrażeń 2 Przetwarzanie html’a HTMLParser BeautifulSoup 3 Przetwarzanie XML’a

(50)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a

XML

Przykład <?xml version="1.0" encoding="UTF-8"?> <biblioteka> <ksiazka egzemplarze="3">

<autor>Ascher, Martelli, Ravenscroft</autor> <tytul>Python. Receptury</tytul> </ksiazka> <ksiazka> <autor/> <tytul>Python. Od podstaw</tytul> </ksiazka> </biblioteka>

(51)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Przetwarzanie XML

przetwarzanie kolejnych znaczników (saxutils)

(52)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

SAX — Simple Api for XML

elementy dokumentu są stopniowo wczytywane

dla każdego elementu wywoływana jest odpowiednia metoda parsera

(53)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Implementacja parsera

Domyślny parser

fromxml.saximport*

classhandle.ContentHandler:

defstartDocument(self): pass

defendDocument(self): pass

defstartElement(self, name, attrs): pass

defendElement(self, name): pass

(54)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Arkusze kalkulacyjne

Arkusz kalkulacyjny to skompresowana zip’em kolekcja plików. Zawartość jest w pliku content.xml

(55)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Implementacja własnego parsera

classOdsHandler(handler.ContentHandler):

def init (self):

self.depth = 0

defstartElement(self, name, attrs):

print(name)

defendElement(self, name):

print(name)

defcharacters(self, value): print(value)

(56)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Uruchomienie parsera

fromxml.saximportmake parser

fromxml.sax.handlerimport feature namespaces

fromxml.saximportsaxutils

parser = make parser()

parser.setFeature(feature namespaces, 0) dh = OdsHandler()

parser.setContentHandler(dh)

importzipfile

withzipfile.ZipFile(’punkty.ods’,’r’) as zf:

withzf.open(’content.xml’,’r’) as fh: parser.parse(fh)

(57)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

SAX: podsumowanie

Przetwarzanie w trybie ’do odczytu’; przetwarzanie porcjami;

(58)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

DOM: Document Object Model

Dokument jest pamiętany w całości jako drzewo Dokument (drzewo) można modyfikować;

Przetwarzanie wymaga sporo czasu i pamięci, całe drzewo jest przechowywane w pamięci;

Specyfikacją zarządza W3C.

(59)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a

Przypomnienie

Przykład <?xml version="1.0" encoding="UTF-8"?> <biblioteka> <ksiazka egzemplarze="3">

<autor>Ascher, Martelli, Ravenscroft</autor> <tytul>Python. Receptury</tytul> </ksiazka> <ksiazka> <autor/> <tytul>Python. Od podstaw</tytul> </ksiazka> </biblioteka>

(60)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a

Ilustracja

Document <?xml version="1.0" encoding="UTF-8"?>

Element Text Element

"" Text "" Text "" Element <biblioteka> <ksiazka> <ksiazka> Element <autor> Element <tytul> Text Asher, ... Text Python. Od ...

(61)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Biblioteki

xml.dom: DOM Level 2

xml.dom.minidom: Lightweight DOM implementation, DOM Level 1

(62)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Implementacja minidom

Klasa Node

atrybut klasy przykład

.nodeName biblioteka, ksiazka, autor

.nodeValue ”Python. Receptury”

.attributes <ksiazka egzemplarze=”3”>

.childNodes lista podwęzłów

(63)

Wyrażenia regularne Przetwarzanie html’a Przetwarzanie XML’a

Tworzenie drzewa

Przeglądanie pliku XML importxml defwezel(node): print(node.nodeName) for n in node.childNodes: wezel(n) doc = xml.dom.minidom.parse(’content.xml’) wezel(doc)

(64)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Manipulacja drzewem DOM

Manipulacja węzłami appendChild(newChild) removeChild(oldChild)

replaceChild(newChild, oldChild)

Tworzenie nowych węzłów

new = document.createElement(’chapter’)

new.setAttribute(’number’,’5’)

document.documentElement.appendChild(new)

print(document.toxml())

(65)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Manipulacja drzewem DOM

Manipulacja węzłami appendChild(newChild) removeChild(oldChild)

replaceChild(newChild, oldChild) Tworzenie nowych węzłów

new = document.createElement(’chapter’)

new.setAttribute(’number’,’5’)

document.documentElement.appendChild(new)

(66)

Wyrażenia regularne Przetwarzanie html’a

Przetwarzanie XML’a

Podsumowanie: DOM

umożliwia manipulowanie całym drzewem wymaga wiele czasu i pamięci dla dużych plików

Cytaty

Powiązane dokumenty

I Parser strumieniowy udostępnia dane zanim sprawdzi poprawność składniową dokumentu. I Wymagania pamięciowe takich parserów są niskie i możemy przetwarzać wielkie dokumenty

I Cała struktura danych jest przechowywana w pamięci, w przypadku dużych dokumentów XML może to stanowić poważny problem.. Struktura danych może zajmować do 30 razy tyle pamięci

Proszę rozszerzyć powyższy program tak, aby wczytywał kilka plików podanych w wierszu poleceń (np. za pomocą tablicy @ARGV). Informacje wyekstrahowane z plików HTML mają być

Zaznacz P, jeśli zdanie jest prawdziwe, lub F, jeśli jest fałszywe.. Wyrażenie jest

g) Adres domowy (Adres domowy zawiera ulicę, spację, numer domu lub numer bloku i mieszkania (nrbloku/nrmieszk.),przecinek, spacją oraz kod pocztowy np. EPI 4K678). Wykorzystać

Polecenie s/&lt;wzorzec&gt;/&lt;nowy&gt;/ służy do zastępowania wystąpień wzorca nowym

Powyższy zapis nie jest tożsamością gdyż, lewa strona dopuszcza ciągi zawierające dwa lub więcej kolejne wystąpienia s, zaś prawa strona nie.. Powyższy zapis nie

Zbudować deterministyczny i zupełny automat skończony akceptujący język nad alfabetem T = {0, 1} będący zbiorem wszystkich łańcuchów zerojedynkowych zawierających co