знакомлюсь с regex

 




месяц копаюсь в регулярных выражениях, так как их применение очень нужно при обработке текста.  Инфы нашлось немало, и полезных утилит тоже, но вот применение пошло не так.

Первая задача: проверка правильности адреса электронной почты. Например:

/^[^@]+@[^@.]+\.[^@]+$/
/[^(\w)|(\@)|(\.)|(\-)]/
/[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}/igm
/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/i

Только вот The Regex Coach  ничего не отобрал из предложенного списка. Пришлось пробовать самому, но и само regex неправильное. Ладно, отложим на потом.

Еще дна задача - парсер ссылок из HTML.Здесь еще хуже:

grepWin выдал невнятный список, который нельзя сохранить в текстовый файл.

AstroGrep справился лучше, но результат нельзя сохранить. Экспериментальный файл взят здесь.

Остался Python, от которого я так старательно отмахивался. В интернетах написано немало примеров использования, но в 3й версии примеры не работают.
Ладно, запустил программу, но хорошо бы из списка получать не только извлеченные ссылки, но и описание к каждой. Чтение статей и доков подсказало, как выделять из списка нужные фрагменты:

import re

pattern  = re.compile('<a[^>]+href=\"(.*?)\"[^>]*>(.*)?</a>')

#for line in open("icon_domestic.html").readlines():
for line in open("icon_domestic.html"):
    for match in re.findall(pattern, line):
#        print(line)
#print(reg.match(str).group(1))
        print ( match[0]+"\t"+match[1])

Интересно, что из языка выкинули group(1) - эволюционирующий, саморазвивающийся язык.

Хорошо, вернулся к PureBasic. Пример ничего не дал, после размышления поменял код:

;http://archive.opaquedream.com/ep_web_3/icon_page/icon_domestic.html

f$="icon_domestic.html"

*m=AllocateMemory(FileSize(f$))

ReadFile(0,f$)
ReadData(0,*m,FileSize(f$))
CloseFile(0)
h$=PeekS(*m,FileSize(f$),#PB_UTF8)
FreeMemory(*m)

r$="<a[^>]+href=\"+Chr(34)+"(.*?)\"+Chr(34)+"[^>]*>(.*)?</a>"
;Debug h$
If CreateRegularExpression(0, r$,#PB_RegularExpression_NoCase|#PB_RegularExpression_MultiLine)
    Dim Result$(0)
    NbFound = ExtractRegularExpression(0, h$, Result$())
    For k = 0 To NbFound-1
      ;      Debug Result$(k)
      
    If ExamineRegularExpression(0, Result$(k))
      While NextRegularExpressionMatch(0)
        Debug RegularExpressionGroup(0, 1)+Chr(9)+RegularExpressionGroup(0, 2)
      Wend
    EndIf
    
    Next
  Else
    Debug RegularExpressionError()
  EndIf
FreeRegularExpression(0)

Ну хоть кое в чем получилось. Пока что нет новых очередных задач, но я еще вернусь, наверное.

Комментарии