python 基础之第十二天(re正则,socket模块)

 

In [14]: 'hello-wold.tar.gz'.split('.')
Out[14]: ['hello-wold', 'tar', 'gz']

In [15]: import re 

In [16]: re.split('-|.','hello-wold.tar.gz')
Out[16]: ['hello', 'wold', 'tar', 'gz']

  In [22]: m = re.search('(to)mo(rr)ow','I will see you tomorrow')

  In [23]: m.groups()
  Out[23]: ('to', 'rr')

  In [33]: m.group(1)
  Out[33]: 'to'

  In [34]: m.group(2)
  Out[34]: 'rr'

 #############################正则######################

`

案例:

要点:

匹配ip:

In [23]: m = re.match('^(d+.d){3}',data)

In [24]: m.group()
Out[24]: '192.168.244.2'

或者:

In [25]: m = re.match('^(.*?) -.*$',data)

In [27]: m.group(1)
Out[27]: '192.168.244.2'

使用字典:

代码如下:

[root@master script]# vim account_patt.py   
#!/usr/bin/python
# coding:utf-8

import re
def account_patt(fname,patt):
    patt_dict = {}
    cpatt = re.compile(patt)
    with open(fname) as fobj:
        for line in fobj:
            m = cpatt.search(line)
            if m:
                key = m.group()
                patt_dict[key] = patt_dict.get(key,0) + 1     ###这边很关键
    return patt_dict





if __name__ == '__main__':
    log_file = '/var/log/httpd/access_log'
    ip_patt = '^(d+.){3}d+'
    br_patt = 'Chrome|Firefox'
    print account_patt(log_file,ip_patt)
    print account_patt(log_file,br_patt)
~                                                                                                          
"account_patt.py" 25L, 573C written                                                      
[root@master script]# python account_patt.py
{'192.168.244.2': 4}
{'Chrome': 2, 'Firefox': 2}

还可以对结果进行排序:

[root@master script]# cat account_patt.py   
#!/usr/bin/python
# coding:utf-8

import re
def account_patt(fname,patt):
    patt_dict = {}
    cpatt = re.compile(patt)
    with open(fname) as fobj:
        for line in fobj:
            m = cpatt.search(line)
            if m:
                key = m.group()
                patt_dict[key] = patt_dict.get(key,0) + 1
    return patt_dict
            

def sort(aDict):                                   ####字典的值排序,很重要                
    alist = []
    patt_list = aDict.items()
    for i in range(len(patt_list)):
        greater = patt_list[0]
        for j in range(len(patt_list[1:])):
            if greater[1] < patt_list[j + 1][1]:
                greater = patt_list[j + 1]
        alist.append(greater)
        patt_list.remove(greater)        
    return alist     
            
   
    


if __name__ == '__main__':
    log_file = '/var/log/httpd/access_log'
    ip_patt = '^(d+.){3}d+'
    br_patt = 'Chrome|Firefox'
    ip_count = account_patt(log_file,ip_patt)
    print sort(ip_count)
    print account_patt(log_file,br_patt)
[root@master script]# python account_patt.py
[('127.0.0.1', 7), ('192.168.244.2', 4), ('192.168.244.9', 1)]
{'Chrome': 2, 'Firefox': 2}

 ####额外##########

对字典排序还有一个模块可以用,貌似在2.7 以上版本才有

import collections

c = collections.Counter()
c.update(('192.168.244.1','192.168.244.2','192.168.244.2'))
print c.most_common(2)   #######most_common(2) 前二

效果:

C:Python27python2.exe D:/pycharm/pa/tt.py
[('192.168.244.2', 2), ('192.168.244.1', 1)]

用类的方法写:

####################socket#######################

对于客户端程序来说,建立一个socket需要两个步骤:一。建立一个实际的socket对象;二。需要把他连接到远程服务器上

在建立socket对象的时候,需要告诉系统两件事:通信类型和协议家族

例子:

[root@master script]# vim tcpserv.py    
#!/usr/bin/python
# coding:utf-8

import socket

host = ''
port = 54321
addr = (host,port)

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(addr)
print 'Waiting for connection....'
s.listen(5)
while True:
    cli_socket,cli_addr = s.accept()
    print 'get connection from', cli_socket.getpeername()
    while True:
        data = cli_socket.recv(4096)
        if not data.strip():
            break
        print data
        cli_socket.send('see you
')
    cli_socket.close()
s.close() 
[root@master script]# vim tcpserv.py    
#!/usr/bin/python
# coding:utf-8

import socket
import time
host = ''
port = 54321
addr = (host,port)

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(addr)
print 'Waiting for connection....'
s.listen(5)
while 1:
    cli_socket,cli_addr = s.accept()
    print 'get connection from', cli_socket.getpeername()
    while True:
        data = cli_socket.recv(4096)
        if not data.strip():
            break
        cli_socket.send('%s :[%s]' % (time.ctime(),data))    ###发送消息到客户端
    cli_socket.close()
s.close()

创建一个客户端:

[root@master script]# vim tcpserv_cli.py 
#!/usr/bin/python
# coding:utf8


import socket
host = ''
port = 54321
addr = (host,port)
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(addr)

while True:
    data =  raw_input('>')
    if not data:
        break
    c.send(data)
    print c.recv(4096)
c.close()

 

客户端:

原文地址:https://www.cnblogs.com/shanhua-fu/p/7418858.html