Продолжаем решать задачки с http://www.pythonchallenge.com . Сегодня четвёртое задание, с которым я изрядно помучился. Выглядит оно вот так:
«один маленький символ, окружённый ИМЕННО тремя телохранителями по бокам».
Сначала я пытался искать что подобное: «XYZpRQT», но таких вхождений было множество. Оказалось, что должно быть что-то вроде этого: «kXYZpRQTf», т.е. один маленький символ в середине, по бокам три больших, а по бокам больших опять маленькие.
Вот моё решение без регулярных выражений (хотя тут они явно напрашиваются):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from urllib.request import urlopen # скачиваем страницу page = urlopen('http://www.pythonchallenge.com/pc/def/equality.html') contents = page.read().decode() # выделяем из html зашифрованный код s = contents.split('<!--')[1].split('-->')[0] word = '' # берем в цикле символ и проверяем символы по бокам чтобы они соответствовали маске "sBBBsBBBs", # где s - символ в нижнем регистре, B - в верхнем for i in range(4, len(s) - 4): if s[i].islower(): if s[i - 1].isupper() and s[i - 2].isupper() and s[i - 3].isupper() and s[i - 4].islower(): if s[i + 1].isupper() and s[i + 2].isupper() and s[i + 3].isupper() and s[i + 4].islower(): word = word + s[i] print(word) # решение с pythonchallenge.com # с регулярными выражениями всё становится проще import re r = re.compile('[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]') print(''.join(re.findall(r, s))) |
from urllib.request import urlopen # скачиваем страницу page = urlopen('http://www.pythonchallenge.com/pc/def/equality.html') contents = page.read().decode() # выделяем из html зашифрованный код s = contents.split('<!--')[1].split('-->')[0] word = '' # берем в цикле символ и проверяем символы по бокам чтобы они соответствовали маске "sBBBsBBBs", # где s - символ в нижнем регистре, B - в верхнем for i in range(4, len(s) - 4): if s[i].islower(): if s[i - 1].isupper() and s[i - 2].isupper() and s[i - 3].isupper() and s[i - 4].islower(): if s[i + 1].isupper() and s[i + 2].isupper() and s[i + 3].isupper() and s[i + 4].islower(): word = word + s[i] print(word) # решение с pythonchallenge.com # с регулярными выражениями всё становится проще import re r = re.compile('[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]') print(''.join(re.findall(r, s)))
Вывод: учите и используйте регулярные выражения чтобы не пришлось изобретать велосипед!