Showing posts with label re. Show all posts
Showing posts with label re. Show all posts

2011/02/16

Проверка логина на корректность

Условие такое:

Логин должен начинаться с латинской буквы, может состоять из латинских букв, цифр, точки и минуса и должен заканчиваться латинской буквой или цифрой. Минимальная длина логина – 1 символ. Максимальная – 20
символов.

import re
from operator import truth

def logincheck(login):
    if login == '' or len(login) > 20:
        print 'False'
        return
    elif len(login) > 2:
        if (truth(re.match('[a-zA-Z]', login[0])) + \
            truth(re.match('[a-zA-Z0-9]', login[-1])) + \
            truth(re.match('^([a-zA-Z0-9\-\.])+$', login[1:-1]))) == 3:
            print 'True'
        else: print 'False'
        return
    elif len(login) == 2:
        if (truth(re.match('[a-zA-Z]', login[0])) + \
            truth(re.match('[a-zA-Z0-9]', login[-1]))) == 2:
            print 'True'
        else: print 'False'
        return
    else:
        if (truth(re.match('[a-zA-Z]', login[0]))) == 1:
            print 'True'
        else: print 'False'

Здесь проверка разбита на несколько этапов: для логина > 2 символов, для = 2 символам и для = 1 символу. Можно, конечно, сделать в 1 регулярное выражение, но мои копошения так и не смогли вывести такую регулярку. Если кто покажет - буду очень рад.

2009/07/24

re - регулярные выражения в python

Осознание регулярных выражений далось мне не сразу, но если поэкспериментировать, то всё будет ок. Не буду затрагивать аспекты, которые даются в книгах, а расскажу лишь про сложности, которые возникли у меня.

Про квантификацию: жадная, ленивая, ревнивая. Ревнивой я вообще никогда не пользовался, а вот про жадную пару слов. К примеру, символ "точка" означает любой символ. Выражение ".+" означает один и более символов - вплоть до конца анализируемого фрагмента. С таким выражением далеко не уедешь, поясню почему. Имеем следующий фрагмент html-кода:
<a href='www.site.com'>GSOM</a> <b>пум-пу-рум</b>
Если применить к этому фрагменту выражение <a href='(.+)'> с целью получения ссылки, то оно жадно зохавает всю строку, ибо последний знак ">" встречается и в самом в конце! Уталить жадность точки поможет вопросительный знак. И вот, если применить выражение "<a href='(.+?)'>", то получим то, что надо: www.site.com

Вообще, у меня выражение (.+?) - одно из самых востребованных при парсинге html-кода.
В качестве примера проапгрейдим один из предыдущий с выдачей гугла так, чтобы на экран выводились только ссылки по запросу:
import urllib2, re

search = 'ivinside.blogspot.com'
headers = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'}
req = urllib2.Request("http://www.google.ru/search?q=" + search + "&start=0&ie=utf-8&oe=utf-8", None, headers)
response = urllib2.urlopen(req)

for url in re.findall(r'<class="r"><href="(.+?)">')
Итак регулярное выражение '<class="r"><href="(.+?)">' откуда я его взял? Посмотрел в исходнике выдачи гугла и увидел нечто похожее на <h3 class=r<>a href="http://site.com" target=_blank class=l ... и применил к этому своё излюбленное точка-плюсик-вопросительный-знак. То-то же.