Проверка IP REGEX - PullRequest
       4

Проверка IP REGEX

1 голос
/ 18 ноября 2011

Я пытался проверить введенную строку (sys argv[1] в данном случае). Мне нужно создать скрипт, который проходит через файл журнала и сопоставляет записи для исходного и целевого ip с любым аргументом, введенным в скрипт. Типы допустимых входных данных:

  • IP или частичный IP
  • «любой» (строка, которая означает все IP-адреса в данном столбце).

Пока у меня есть следующий код. Всякий раз, когда я запускаю скрипт в bash вместе с аргументом (например, любым случайным числом или словом / алфавитом и т. Д.), Я получаю ошибки. Пожалуйста, дайте мне знать, как я могу их исправить. Очень ценю способ проверки ввода по IP-адресу reg ex и слову any.

#!/usr/bin/python

import sys,re

def ipcheck(ip):
    #raw patterns for "any" and "IP":
    ippattern = '([1-2]?[0-9]?[0-9]\.){1,3}([1-2]?[0-9]?[0-9])?'
    anypattern = any
    #Compiled patterns
    cippattern = re.compile(ippattern)
    canypattern = re.compile(any)
    #creating global variables for call outside function    
    global matchip
    global matchany
    #matching the compiled pattern 
    matchip = cippattern.match(ip)
    matchany = canypattern.match(ip)

new = sys.argv[1]
snew = str(new)
print type(snew)
ipcheck(new)

Также я пытался сделать это таким образом, но это продолжало давать мне ошибки, возможно ли передать 2 аргумента в цикл if через «ИЛИ |» оператор? Как бы я сделал это таким образом? [/ B]

#if (matchip | matchany) :  
    #print "the ip address is valid"
#else:
    #print "Invalid Destination IP"


Error
========================

user@bt:/home# ./ipregex.py a
<type 'str'>
Traceback (most recent call last):
File "./ipregex.py", line 21, in <module>
ipcheck(new)
File "./ipregex.py", line 15, in ipcheck
matchany = re.match(anypattern,ip)
File "/usr/lib/python2.5/re.py", line 137, in match
return _compile(pattern, flags).match(string)
File "/usr/lib/python2.5/re.py", line 237, in _compile
raise TypeError, "first argument must be string or compiled pattern"
TypeError: first argument must be string or compiled pattern

=============================================== ===========

EDIT

Я пытался сопоставить IP без компиляции регулярного выражения. Поэтому я изменил скрипт для этого. Это привело к ошибке:

Error

user@bt:/home# ./ipregex.py a
<type 'str'>
Traceback (most recent call last):
File "./ipregex.py", line 21, in <module>
ipcheck(new)
File "./ipregex.py", line 15, in ipcheck
matchany = anypattern.match(ip)
AttributeError: 'builtin_function_or_method' object has no attribute 'match'

=============================================== ===========

EDIT # 2

Мне удалось воспроизвести мою ошибку в более простой версии кода. Какого черта я делаю не так ??????

#!/usr/bin/python

import sys
import re

def ipcheck(ip):
    anypattern = any
    cpattern = re.compile(anypattern)
    global matchany
    matchany = cpattern.match(ip)
    if matchany:
            print "ip match: %s" % matchany.group()
new = sys.argv[1]
ipcheck(new)

ERROR

user@bt:/home# ./test.py any
Traceback (most recent call last):
File "./test.py", line 14, in <module>
ipcheck(new)
File "./test.py", line 8, in ipcheck
cpattern = re.compile(anypattern)
File "/usr/lib/python2.5/re.py", line 188, in compile
return _compile(pattern, flags)
File "/usr/lib/python2.5/re.py", line 237, in _compile
raise TypeError, "first argument must be string or compiled pattern"
TypeError: first argument must be string or compiled pattern

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Когда вы используете re.compile, вы вызываете функцию match для скомпилированного объекта: ippattern.match(ip).Кроме того, чтобы получить соответствующий IP-адрес из MatchObject , используйте MatchObject.group().Некоторые исправили ваш пример, и теперь он должен делать то, что вам нужно:

#!/usr/bin/python

import sys
import re

def ipcheck(ip):
    ippattern_str = '(([1-2]?[\d]{0,2}\.){1,3}([1-2]?[\d]{0,2})|any)'

    ippattern = re.compile(ippattern_str)
    # ippattern is now used to call match, passing only the ip string
    matchip = ippattern.match(ip)
    if matchip:
        print "ip match: %s" % matchip.group()

if len(sys.argv) > 1:
    ipcheck(sys.argv[1])

Некоторые результаты:

[ 19:46 jon@hozbox ~/SO/python ]$ ./new.py 100.
ip match: 100.
[ 19:46 jon@hozbox ~/SO/python ]$ ./new.py 100.1.
ip match: 100.1.
[ 19:46 jon@hozbox ~/SO/python ]$ ./new.py 100.1.55.
ip match: 100.1.55.
[ 19:46 jon@hozbox ~/SO/python ]$ ./new.py 100.1.55.255
ip match: 100.1.55.255
[ 19:47 jon@hozbox ~/SO/python ]$ ./new.py any
ip match: any
[ 19:47 jon@hozbox ~/SO/python ]$ ./new.py foo
[ 19:47 jon@hozbox ~/SO/python ]$ 
0 голосов
/ 18 ноября 2011

Это регулярное выражение может быть лучше:

((([1-2]?[0-9]?[0-9]\.){1,3}([1-2]?[0-9]?[0-9])?)|any)

Оно будет соответствовать чему-либо вроде:

127.0.0.1
127.0.0
127.0
127.
192.168.1.1
any

Ваше регулярное выражение будет иметь проблемы с приведенным выше, потому что оно не соответствует 0.

Редактировать:

Я пропустил часть о сопоставлении any.

Это регулярное выражение будет соответствовать нескольким недействительным адресам, однако, если вы просто ищетечерез лог-файлы, которые должны быть в порядке.Вы можете проверить эту ссылку , если вам действительно нужно быть точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...