/Cw6
TI:WTBD/Ćwiczenia 6
- Zadanie -- ,,kartkówka":
- napisać program, który posortuje linie strumienia tekstowego według ich długości, liczonej w znakach (unikodowych) z pominięciem ew. znaków pustych na początku i końcu linii; kodowanie może być podane jako argument opcji wywołania -e, domyślnie przyjmujemy UTF-8; linie o tej samej długości sortuje w porządku ,,leksykograficznym".
Przykład rozwiązania:
#! /usr/bin/python
# coding: utf-8
from fileinput import input
from optparse import OptionParser
parser = OptionParser()
parser.add_option('-e', '--encoding', dest='encoding', default='utf-8')
opts, args = parser.parse_args()
enc = opts.encoding
def keyfun(line):
s = line.decode(enc).strip()
return len(s), s
lines = sorted(input(args), key=keyfun)
for l in lines:
print l,
Funkcja keyfun, wyznaczająca klucz sortowania, zwraca dwuelementową krotkę (tuple) składającą się z długości linii, i samej treści linii (po przekształceniu na napis unikodowy i oczyszczeniu ze zbędnych znaków pustych, zgodnie z warunkami zadania). Korzystamy tutaj z faktu, że domyślne sortowanie sekwencji wykorzystuje domyślny porządek kolejnych elementów -- a więc w tym przypadku, będzie oparte w pierwszej kolejności na porządku długości linii (numerycznym), a w drugiej -- na porządku leksykograficznym ich (zdekodowanej i oczyszczonej) treści. Uwaga: definicja keyfun może korzystać z wartości zmiennej enc, zawierającej nazwę kodowania, ponieważ jest wpisana w miejscu, w którym wartość tej zmiennej jest już znana. Zupełnie inaczej, niż w językach statycznie kompilowanych! (tam kolejność definicji w pliku źródłowym nie gra roli).
- Wyrażenia regularne w Pythonie
- funkcja 're.compile'
- 'search' -- metoda i funkcja
- mikro-grep w Pythonie (pygrep.py), do ćwiczenia składni wyrażeń regularnych w jej dialekcie pythonowym
import re
from fileinput import input
from sys import argv
rx = re.compile(argv[1].decode('utf-8'), re.UNICODE)
for l in input(argv[2:]):
if rx.search(l.decode('utf-8')): print l,
- 'findall' -- metoda i funkcja. Parsowanie tekstu (wyodrębnianie interesujących fragmentów) poprzez wykorzystanie ,,grup wychwytujących".