Форум сайта python.su
0
Здравствуйте! Нужно выдернуть из строки 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)
Офлайн
3
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
ешё можно обойтись без компиляции и использовать re.search(regexp, text)
Офлайн
0
Спасибо за помощь.
Пользуясь случаем, задам ещё один нубский вопрос:
Почему регулярка 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)
Офлайн
3
UsCr, советую для создания/регулярок использовать RegexBuddy.
там Вы сможете увидеть, что ведущий знак вопроса подсвечен красным, ибо
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE
Офлайн
0
beelze
UsCr, советую для создания/регулярок использовать RegexBuddy.
там Вы сможете увидеть, что ведущий знак вопроса подсвечен красным, ибо
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE
r'[S,s]?poofing\sattack'
Отредактировано UsCr (Май 9, 2012 09:42:53)
Офлайн
3
запятая там кажется лишняя в
[s,S]
Отредактировано dehun (Май 9, 2012 09:49:47)
Офлайн
3
я у себя попробывал вот так из питона-
In [6]: re.search(r'[Ss]?poofing\sattack', 'bla bla bla spoofing attack ololo')
Out[6]: <_sre.SRE_Match object at 0x83b68e0>
Офлайн
0
Посыпаю голову пеплом. В процедуре, где определялся тип события (как раз спуфинг или петля) ошибся в синтаксисе. В итоге проверка на не пустой объект вылезла из цикла, что и приводило к тому, что для петли определение работало (первая проверка), а для спуфинга происходила проверка на петлю, обьект становился 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)
Офлайн
3
for i in event_pattens.keys(): event = event_pattens[i].search(string) if event:
[L,l]
if event: return i else: pass return 'event detect failed'

return i if event else 'epic fail'
Отредактировано beelze (Май 9, 2012 17:17:45)
Офлайн