python実戦シリーズの正則取得IPアドレス(八)


1.正規表現re
pythonではreモジュールによって正規表現に関連する機能を実現し、正規表現はパターンマッチングpatterであり、パターンマッチングによって文字の検索searchとマッチングmatch機能を実現し、正規表現でよく使われる原文字は以下の通りである.
げんもじ
代表的な意味
literal
「hello」などの文字列自体を表す
.
任意の文字
^
一致する文字列の先頭
$
一致する文字列の末尾
*
前の正規表現を0回または複数回一致させ、{0,}に相当する.
+
前の正規表現を1回または複数回一致させ、{1,}に相当する.
?
前の正規表現を0回または1回一致させ、{0,1}に相当する.
{M,N}
前の正規表現に一致する最小M回、最大N回
{N}
前の正規表現に少なくともN回一致し、{N,}に相当する.
[]
[0-9],[a-z],[a-zA-Z]などの文字列グループ内の任意の文字を一致させる
[^]
「^a-zA-Z」などの文字列グループ内の任意の文字を除外すると、すべての文字が除外されます.
\d
データd.txtなどの[0-9]に相当する数字
\D
dとは逆に[^0-9]に相当
\w
「a-zA-Z 0-9」に相当するアルファベットと数字を一致させる.
\W
アルファベットと数字を除いて、[^a-zA-Z 0-9]に相当します.
\s
空白の文字、tabを含んで、車に戻って、[trvf]に相当します
2.正規表現reの例
1.一致する数字
>>> import commands
>>> network = commands.getstatusoutput('ifconfig')
>>> import re
>>> re.findall('[0-9]+',network[1])

#        , \d+       
>>> re.findall('\d+',network[1])   

  1:         
>>> re.findall('\d',network[1]) 

  2:      0-99     ,0-9        [0-9]  ,10-99        [1-9]{1,2},      [0-9]{1,2}
>>> re.findall('[0-9]{1,2}',network[1])

  3:      0-255     ,      :0-99  [0-9]{1,2},100,199  1[0-9][0-9],200-249  2[0-4][0-9],250-255  25[0-5]   
>>> re.findall('[0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5]',network[1])

2.照合shell
>>> f = file('/etc/passwd','r')                
>>> for line in f.readlines():                 
...     re.findall('\/bin\/[a-z]*sh$',line.strip())
... 
['/bin/bash']
[]
[]
['/bin/bash']
[]
['/bin/bash']
3.reモジュールの一般的な方法
reはpythonが正規表現に関連する機能を実現するモジュールで、このモジュールには多重方法が含まれており、一般的な方法はsearch()を検索し、matchに一致し、すべてのfindall()を検索し、compile()をコンパイルし、split()を切断し、置換sub()を検索するなどの方法があり、下から説明します.
1.match()は、一致し、文字列の先頭ビットから検索を開始し、見つかったら返し、見つからなかったら空
>>> str = 'Hello python boys'          
>>> if m is not None:                  
...    print "            "
...    print "       :%s" % (m.group())
... else:
...    print "   "
... 
            
       :Hello 

#       
>>> m = re.match('python',str)
>>> print m
None
>>> if m:
...   print "match,string is:%s" % (m.group())
... else:
...   print "not match"
... 
not match

@@  ,  match() search()  ,          ,      group()  ,             ,      :match()        , search()      

2.search()は、文字列の開始から終了まで検索し、検索すると返され、見つからないと空になります.
>>> m = re.search('python',str)
>>> print m
<_sre.sre_match>
>>> if m:
...     print "match,string is:%s" % (m.group())
... else:
...     print "not match"
... 
match,string is:python

3.compile()は、正規表現をコンパイルし、繰り返し使用しやすく、search()、match()、findall()関数と組み合わせて使用する必要があります.
>>> regex=re.compile('python')
>>> regex.search(str)
<_sre.sre_match>
>>> m = regex.search(str)
>>> print m
<_sre.sre_match>
>>> if m:
...   print "match,string:%s" % (m.group())
... else:
...   print "not match"
... 
match,string:python

>>> m=regex.match(str) 
>>> print m
None

4.findall()は、すべての文字列から検索され、見つかったらリストに追加され、リストとして表示され、見つからなかったらリストが空になります
>>> re.findall('o',str)
['o', 'o', 'o']

      :
>>> regex=re.compile('o')
>>> regex.findall(str)
['o', 'o', 'o']

4.正規表現によるIPアドレスの取得