Найти - Пользователи
Полная версия: Проблема с использованием регулярок.
Начало » Python для новичков » Проблема с использованием регулярок.
1 2
UsCr
Здравствуйте! Нужно выдернуть из строки 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

Что я делаю не так?
dehun
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()).

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

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

Почему регулярка 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/ всё ОК, в реальном скрипте не срабатывает.
beelze
UsCr, советую для создания/регулярок использовать RegexBuddy.
там Вы сможете увидеть, что ведущий знак вопроса подсвечен красным, ибо
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE
UsCr
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’ при добавлении любых символов вначале или в конце - уже не находит…
dehun
запятая там кажется лишняя в
[s,S]
.
это правда не должно сушествено поменять дело.
а как там вызов происходит из скрипта?
dehun
я у себя попробывал вот так из питона-
In [6]: re.search(r'[Ss]?poofing\sattack', 'bla bla bla spoofing attack ololo')
Out[6]: <_sre.SRE_Match object at 0x83b68e0>
UsCr
Посыпаю голову пеплом. В процедуре, где определялся тип события (как раз спуфинг или петля) ошибся в синтаксисе. В итоге проверка на не пустой объект вылезла из цикла, что и приводило к тому, что для петли определение работало (первая проверка), а для спуфинга происходила проверка на петлю, обьект становился 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'
beelze
       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'
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB