Уведомления

Группа в Telegram: @pythonsu

#1 Май 8, 2012 14:27:29

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

Здравствуйте! Нужно выдернуть из строки ip адрес. Написал такой простенький скрипт:

#!/usr/bin/python
import re
import sys
string = sys.argv[1]
print string
pttrn = r'\d+\.\d+\.\d+\.\d+'
pattern = re.compile(pttrn)
m = pattern.match(string)
if m:
        print m.span()
else:
        print m

Запускаю:

./dlink_pyparser.py 123.32.45.10
123.32.45.10
(0, 12)

./dlink_pyparser.py 14623457123.32.45.10234623

Тут всё ожидаемо.

Далее непонятки:

./dlink_pyparser.py bar123.32.45.10foo
bar123.32.45.103foo
None

./dlink_pyparser.py 'bar 123.32.45.10 foo'
bar 123.32.45.103 foo
None

Что я делаю не так?



Отредактировано UsCr (Май 8, 2012 14:28:56)

Офлайн

#2 Май 8, 2012 14:38:45

dehun
От: Ukraine::Kiev
Зарегистрирован: 2012-04-25
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

match проверяет в начале строки.
search - по всей строке.

re.search(pattern, string, flags=0)¶

Scan through string looking for a location where the regular expression pattern produces a match, and return a corresponding MatchObject instance. Return None if no position in the string matches the pattern; note that this is different from finding a zero-length match at some point in the string.

re.match(pattern, string, flags=0)¶

If zero or more characters at the beginning of string match the regular expression pattern, return a corresponding MatchObject instance. Return None if the string does not match the pattern; note that this is different from a zero-length match.

Note that even in MULTILINE mode, re.match() will only match at the beginning of the string and not at the beginning of each line.

If you want to locate a match anywhere in string, use search() instead (see also search() vs. match()).

Офлайн

#3 Май 8, 2012 14:39:57

dehun
От: Ukraine::Kiev
Зарегистрирован: 2012-04-25
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

ешё можно обойтись без компиляции и использовать re.search(regexp, text)

Офлайн

#4 Май 8, 2012 16:30:58

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

Спасибо за помощь.

Пользуясь случаем, задам ещё один нубский вопрос:

Почему регулярка r'?poofing\sattack' не находит совпадений в строке “Jan 20 17:24:07 192.130.52.223 CRIT: Possible spoofing attack from 11-35-E5-73-44-12 port 1:23”?

Проверяю тут - http://www.rubular.com/ всё ОК, в реальном скрипте не срабатывает.



Отредактировано UsCr (Май 8, 2012 18:26:49)

Офлайн

#5 Май 8, 2012 19:41:35

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

UsCr, советую для создания/регулярок использовать RegexBuddy.
там Вы сможете увидеть, что ведущий знак вопроса подсвечен красным, ибо
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE

Офлайн

#6 Май 9, 2012 09:12:23

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

beelze
UsCr, советую для создания/регулярок использовать RegexBuddy.
там Вы сможете увидеть, что ведущий знак вопроса подсвечен красным, ибо
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE

Парсер съел начало. Было так:

r'[S,s]?poofing\sattack'

UPD:

Упростил регулярку до: ‘spoofing’ Ещё поэкспериментировал со строкой. Находит совпадения только в ‘spoofing’ при добавлении любых символов вначале или в конце - уже не находит…



Отредактировано UsCr (Май 9, 2012 09:42:53)

Офлайн

#7 Май 9, 2012 09:45:34

dehun
От: Ukraine::Kiev
Зарегистрирован: 2012-04-25
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

запятая там кажется лишняя в

[s,S]
.
это правда не должно сушествено поменять дело.
а как там вызов происходит из скрипта?

Отредактировано dehun (Май 9, 2012 09:49:47)

Офлайн

#8 Май 9, 2012 09:51:04

dehun
От: Ukraine::Kiev
Зарегистрирован: 2012-04-25
Сообщения: 26
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

я у себя попробывал вот так из питона-

In [6]: re.search(r'[Ss]?poofing\sattack', 'bla bla bla spoofing attack ololo')
Out[6]: <_sre.SRE_Match object at 0x83b68e0>

Офлайн

#9 Май 9, 2012 13:23:57

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

Посыпаю голову пеплом. В процедуре, где определялся тип события (как раз спуфинг или петля) ошибся в синтаксисе. В итоге проверка на не пустой объект вылезла из цикла, что и приводило к тому, что для петли определение работало (первая проверка), а для спуфинга происходила проверка на петлю, обьект становился None и уже не становился не пустым. Снаружи это выглядело так, что для петли работает, а для спуфинга - нет.

Это верное обьяснение? Показываю код:

#EVENT SECTION
LOOP_PATTERN = r'[L,l]?oop(back)?\s?[D,d]?(etection)?'
SPOOFING_PATTERN = r'[Ss]?poofing\sattack'
# pn means "pattern"
lppn = re.compile(LOOP_PATTERN)
sgpn = re.compile(SPOOFING_PATTERN)
event_pattens = {'loop':lppn, 'spoofing':sgpn}
def event_type(string):
       for i in event_pattens.keys():
               event = event_pattens[i].search(string)
       if event:
               return i
       else:
               pass
       return 'event detect failed'



Отредактировано UsCr (Май 9, 2012 13:52:55)

Офлайн

#10 Май 9, 2012 16:14:48

beelze
Зарегистрирован: 2012-04-11
Сообщения: 104
Репутация: +  3  -
Профиль   Отправить e-mail  

Проблема с использованием регулярок.

       for i in event_pattens.keys():
               event = event_pattens[i].search(string)
       if event:
проверяете именно последнее сравнение, это верно?

[L,l]
Вам уже советовали поправить; кроме того, не проще ли re.I флаг использовать в данном случае?

       if event:
               return i
       else:
               pass
       return 'event detect failed'

кошмар какой-то
не проще ли
return i if event else 'epic fail'

Отредактировано beelze (Май 9, 2012 17:17:45)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version