zoukankan      html  css  js  c++  java
  • 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()

     

    客户端:

  • 相关阅读:
    2020春Contest
    HDU Count the string (KMP)
    P1757 通天之分组背包
    L1-050 倒数第N个字符串
    3月份目标
    Division UVa725
    数三角
    luogu P2051 [AHOI2009]中国象棋 dp 状态压缩+容斥
    Codeforces Round #654 (Div. 2) E
    Codeforces Round #654 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/shanhua-fu/p/7418858.html
Copyright © 2011-2022 走看看