Уведомления

Группа в Telegram: @pythonsu

#1 Март 8, 2013 00:46:50

MarkHammer
Зарегистрирован: 2013-02-24
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

и снова регулярка

IP_EVDO = re.findall (r'ethrIp+)',s) + re.findall (r'cell((^|]+)')
эта строка выдает такую ошибку :
Traceback (most recent call last):
File “CPython33/ALL_IP.py”, line 64, in <module>
IP_EVDO = re.findall (r'ethrIp+)',s) + re.findall (r'cell((^|]+)')
TypeError: findall() missing 1 required positional argument: ‘string’

с ошибкой согласен - но как мне составить регулярное выражение, удовлетворяющее этим двум шаблонам ? в смысле что-бы из текста выбирались одновременно пары значений…

Отредактировано MarkHammer (Март 8, 2013 00:47:27)

Офлайн

#2 Март 8, 2013 01:35:50

MarkHammer
Зарегистрирован: 2013-02-24
Сообщения: 97
Репутация: +  0  -
Профиль   Отправить e-mail  

и снова регулярка

Разобрался сам…
у кого появится подобный вопрос - поможет вот это :

Задача № 7: Группировка результатов поиска на примере анализа лога

Дано: строки результата логирования команды ping в Ubuntu Linux.
log=[
'64 bytes from localhost.localdomain (127.0.0.1): icmp_req=1 ttl=64 time=0.033 ms',
'64 bytes from localhost.localdomain (127.0.0.1): icmp_req=2 ttl=64 time=0.034 ms',
'64 bytes from localhost.localdomain (127.0.0.1): icmp_req=3 ttl=64 time=0.031 ms',
'64 bytes from localhost.localdomain (127.0.0.1): icmp_req=4 ttl=64 time=0.031 ms']
Задача: найти пары “номер запроса” -> “время ответа”
Теория
Такой “сырой” лог трудно анализировать. Гораздо лучше то, что мы пытаемся получить в результате выполнения задачи. Естественно сырой лог будет одной строкой, но все же представим, что мы разбили его на отдельные строки. Для того, чтобы получить сгруппированные результаты можно воспользоваться круглыми скобками: ( и ). До этого мы пользовались findall, но MatchingObject имеет параметры group и groups, которые возвращают найденные результаты. groups возвращает кортеж групп результатов, group(number) возвращает результат для группы за номером number.
Если в строке есть несколько групп, которые соответствуют одному и тому же шаблону, не стоит его копировать в выражении несколько раз, достаточно сократить запись к номеру группы. То есть ()() равнозначно ()(\1). Кто знаком с конфигурацией mod_rewrite, например, в сервере Apache2, точно сталкивался с такой записью, так как там она применяется сплошь и рядом.
Решение:
import pprint
pattern = re.compile('(icmp_req=+).*(time=+ ms)')
result =
for line in log:
result.append(pattern.search(line).groups())
pprint.pprint(result)
[('icmp_req=1', ‘time=0.033 ms’),
('icmp_req=2', ‘time=0.034 ms’),
('icmp_req=3', ‘time=0.031 ms’),
('icmp_req=4', ‘time=0.031 ms’)]
С такими данными работать уже гораздо проще и приятнее. Итак, разберем выражение:
(icmp_req=+) - находим число, перед которым идет текст ‘icmp_req=’ и делаем из него группу символов
.* - дальше идет любой набор символов
(time=+|пробел|ms) - находим число, перед которым идет текст ‘time=’, и после которого идет пробел и текст ‘ms’.

Офлайн

#3 Март 8, 2013 03:34:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9999
Репутация: +  857  -
Профиль   Отправить e-mail  

и снова регулярка

лучше все коды и данные оформляй с помощью тегов, потому что они сохраняют текст в первоначальном виде

    пример # пробелы в начале сохранились и хорошо видны

(это если хочешь, чтобы твои коды вообще читали)



Отредактировано py.user.next (Март 8, 2013 03:35:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version