месяц копаюсь в регулярных выражениях, так как их применение очень нужно при обработке текста. Инфы нашлось немало, и полезных утилит тоже, но вот применение пошло не так.
Первая задача: проверка правильности адреса электронной почты. Например:
/^[^@]+@[^@.]+\.[^@]+$/
/[^(\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
/[^(\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)
Ну хоть кое в чем получилось. Пока что нет новых очередных задач, но я еще вернусь, наверное.
Комментарии
Отправить комментарий