1. In [14]: 'hello-wold.tar.gz'.split('.')
  2. Out[14]: ['hello-wold', 'tar', 'gz']
  3.  
  4. In [15]: import re
  5.  
  6. In [16]: re.split('-|\.','hello-wold.tar.gz')
  7. 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'

使用字典:

代码如下:

  1. [root@master script]# vim account_patt.py
  2. #!/usr/bin/python
  3. # coding:utf-8
  4. import re
  5. def account_patt(fname,patt):
  6. patt_dict = {}
  7. cpatt = re.compile(patt)
  8. with open(fname) as fobj:
  9. for line in fobj:
  10. m = cpatt.search(line)
  11. if m:
  12. key = m.group()
  13. patt_dict[key] = patt_dict.get(key,0) + 1 ###这边很关键
  14. return patt_dict
  15. if __name__ == '__main__':
  16. log_file = '/var/log/httpd/access_log'
  17. ip_patt = '^(\d+\.){3}\d+'
  18. br_patt = 'Chrome|Firefox'
  19. print account_patt(log_file,ip_patt)
  20. print account_patt(log_file,br_patt)
  21. ~
  22. "account_patt.py" 25L, 573C written
  23. [root@master script]# python account_patt.py
  24. {'192.168.244.2': 4}
  25. {'Chrome': 2, 'Firefox': 2}

还可以对结果进行排序:

  1. [root@master script]# cat account_patt.py
  2. #!/usr/bin/python
  3. # coding:utf-8
  4.  
  5. import re
  6. def account_patt(fname,patt):
  7. patt_dict = {}
  8. cpatt = re.compile(patt)
  9. with open(fname) as fobj:
  10. for line in fobj:
  11. m = cpatt.search(line)
  12. if m:
  13. key = m.group()
  14. patt_dict[key] = patt_dict.get(key,0) + 1
  15. return patt_dict
  16.  
  17. def sort(aDict): ####字典的值排序,很重要
  18. alist = []
  19. patt_list = aDict.items()
  20. for i in range(len(patt_list)):
  21. greater = patt_list[0]
  22. for j in range(len(patt_list[1:])):
  23. if greater[1] < patt_list[j + 1][1]:
  24. greater = patt_list[j + 1]
  25. alist.append(greater)
  26. patt_list.remove(greater)
  27. return alist
  28. if __name__ == '__main__':
  29. log_file = '/var/log/httpd/access_log'
  30. ip_patt = '^(\d+\.){3}\d+'
  31. br_patt = 'Chrome|Firefox'
  32. ip_count = account_patt(log_file,ip_patt)
  33. print sort(ip_count)
  34. print account_patt(log_file,br_patt)
  35. [root@master script]# python account_patt.py
  36. [('127.0.0.1', 7), ('192.168.244.2', 4), ('192.168.244.9', 1)]
  37. {'Chrome': 2, 'Firefox': 2}

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

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

  1. import collections
  2.  
  3. c = collections.Counter()
  4. c.update(('192.168.244.1','192.168.244.2','192.168.244.2'))
  5. print c.most_common(2) #######most_common(2) 前二

效果:

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

用类的方法写:

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

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

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

例子:

  1. [root@master script]# vim tcpserv.py
  2. #!/usr/bin/python
  3. # coding:utf-8
  4.  
  5. import socket
  6.  
  7. host = ''
  8. port = 54321
  9. addr = (host,port)
  10.  
  11. s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  12. s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  13. s.bind(addr)
  14. print 'Waiting for connection....'
  15. s.listen(5)
  16. while True:
  17. cli_socket,cli_addr = s.accept()
  18. print 'get connection from', cli_socket.getpeername()
  19. while True:
  20. data = cli_socket.recv(4096)
  21. if not data.strip():
  22. break
  23. print data
  24. cli_socket.send('see you\n')
  25. cli_socket.close()
  26. s.close() 
  1. [root@master script]# vim tcpserv.py
  2. #!/usr/bin/python
  3. # coding:utf-8
  4.  
  5. import socket
  6. import time
  7. host = ''
  8. port = 54321
  9. addr = (host,port)
  10.  
  11. s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  12. s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  13. s.bind(addr)
  14. print 'Waiting for connection....'
  15. s.listen(5)
  16. while 1:
  17. cli_socket,cli_addr = s.accept()
  18. print 'get connection from', cli_socket.getpeername()
  19. while True:
  20. data = cli_socket.recv(4096)
  21. if not data.strip():
  22. break
  23. cli_socket.send('%s :[%s]' % (time.ctime(),data)) ###发送消息到客户端
  24. cli_socket.close()
  25. s.close()

创建一个客户端:

  1. [root@master script]# vim tcpserv_cli.py
  2. #!/usr/bin/python
  3. # coding:utf8
  4.  
  5. import socket
  6. host = ''
  7. port = 54321
  8. addr = (host,port)
  9. c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  10. c.connect(addr)
  11.  
  12. while True:
  13. data = raw_input('>')
  14. if not data:
  15. break
  16. c.send(data)
  17. print c.recv(4096)
  18. c.close()

客户端:

python 基础之第十二天(re正则,socket模块)的更多相关文章

  1. Python基础系列讲解——TCP协议的socket编程

    前言 我们知道TCP协议(Transmission Control Protocol, 传输控制协议)是一种面向连接的传输层通信协议,它能提供高可靠性通信,像HTTP/HTTPS等网络服务都采用TCP ...

  2. Py修行路 python基础 (二十四)socket编程

    socket编程 一.客户端/服务端架构 客户端/服务端架构 即C/S架构,包括:1.硬件C/S架构,2.软件C/S架构. 互联网中处处都是C/S架构,学习socket 就是为了完成C/S架构的开发. ...

  3. Python基础笔记系列十二:requests模块的简单应用

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! httpbin httpbin这个网站能测试 HTTP 请求和响应的各种信 ...

  4. Py修行路 python基础 (二十一)logging日志模块 json序列化 正则表达式(re)

    一.日志模块 两种配置方式:1.config函数 2.logger #1.config函数 不能输出到屏幕 #2.logger对象 (获取别人的信息,需要两个数据流:文件流和屏幕流需要将数据从两个数据 ...

  5. python基础——14(shelve/shutil/random/logging模块/标准流)

    一.标准流 1.1.标准输入流 res = sys.stdin.read(3) 可以设置读取的字节数 print(res) res = sys.stdin.readline() print(res) ...

  6. python基础(十三)--os和sys模块

    os模块 os.getpwd():获取当前工作目录(windows下没有) os.listdir(path):列出目录下的文件 os.remove(path):删出文件 (不能是目录,即文件夹) os ...

  7. Python 基础篇:编码、变量、模块

    1. 编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ASCII). 2. 变量 变量定义的规则: 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数 ...

  8. python基础===中文手册,可查询各个模块

    http://python.usyiyi.cn/translate/python_352/index.html

  9. python基础-协程函数、递归、模块、包等内容

    1. 协程函数 1.1 yield基本用法 yield作用 1.把函数的执行结果封装好,即封装__iter__和__next__,即得到一个迭代器 2.与return功能类似,都可以返回值,但不同的是 ...

随机推荐

  1. Neural Networks for Machine Learning by Geoffrey Hinton (1~2)

    机器学习能良好解决的问题 识别模式 识别异常 预測 大脑工作模式 人类有个神经元,每一个包括个权重,带宽要远好于工作站. 神经元的不同类型 Linear (线性)神经元  Binary thresho ...

  2. jQeury入门:遍历

    一旦用jQuery创建一个初始的包装集.你就能深度遍历刚刚选择的包装集. 遍历能够被分为三个基础元件:父级.子级,同级.jQuery为全部这些元件提供丰富易用的方法.注意每个方法都能轻易的传递给字符串 ...

  3. javascript原生调用摄像头

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  4. Codeforces Beta Round #1 A. Theatre Square

    从今天開始.就要在Codeforces里有一个新的開始了,貌似任务非常重的说~~ Codeforces专题我将会记录全部通过的题目,事实上仅仅要通过的题目都是水题啊!. 题目大意: 依照要求计算须要多 ...

  5. Java内部类之间的闭包和回调详解

    前言 闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自 ...

  6. Centos7-安装Weblogic并配置 domain

    1.创建用户组 [root@localhost weblogic]# groupadd weblogic 2.创建 tmn 用户 [root@localhost weblogic]# useradd ...

  7. 转_【大话IT】你离大数据架构师有多远?

    话题背景: 首先,先科普下“数据架构师”的相关职责:数据架构师要负责建立和维持公司数据储存的技术基准,策划硬体和软体的结构,确保数据储存系统可以支持未来的数据量和分析需求. 据了解,美国地区数据架构师 ...

  8. Python使用Mysql过程中一些错误

    Python使用Mysql过程中一些错误 ssh登录远程服务器 ssh ubuntu@xxx.xxx.xx.xx 第一:ubuntu终端中登录Mysql mysql -uroot -p 然后输入密码即 ...

  9. unity3d开发的android应用中增加AD系统的详细步骤

    unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d  Unity3d已经支持android,怎样在程序里增加admob?  试了一下,确实能够, ...

  10. EEPlat 主子表和对象引用配置实例

    本次实例以常见的订单维护,来介绍下平台内类似主子表结构的配置方法. 订单包含订单头和订单明细.订单头包含简单信息:订单编号.订单状态.客户. 交付日期.订单日期.备注等.订单明细包含:订单产品.定单数 ...