天天看点

常用的python模块

一、time与datetime模块

1、在Python中,通常有这几种方式来表示时间:

时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量

格式化的时间字符串(Format String)

结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)

1

2

3

4

5

<code>import</code> <code>time</code>

<code>print</code><code>(time.time())                    </code><code># 时间戳:1515302219.4076796</code>

<code>print</code><code>(time.strftime(</code><code>"%Y-%m-%d %X"</code><code>)) </code><code>#格式化的时间字符串:2018-01-07 13:16:59</code>

<code>print</code><code>(time.localtime()) </code><code>#本地时区的struct_time,time.struct_time(tm_year=2018, tm_mon=1, tm_mday=7, tm_hour=13, tm_min=16, tm_sec=59, tm_wday=6, tm_yday=7, tm_isdst=0)</code>

<code>print</code><code>(time.gmtime())    </code><code>#UTC时区的struct_time,time.struct_time(tm_year=2018, tm_mon=1, tm_mday=7, tm_hour=5, tm_min=16, tm_sec=59, tm_wday=6, tm_yday=7, tm_isdst=0)</code>

2、三种时间表示方法之间的转换

(1)将一个时间戳转换为当前时区的struct_time

<code>print</code><code>(time.localtime(</code><code>1473525444.037215</code><code>))     </code><code>#结果time.struct_time(tm_year=2016, tm_mon=9, tm_mday=11, tm_hour=0, tm_min=37, tm_sec=24, tm_wday=6, tm_yday=255, tm_isdst=0)</code>

(2)将一个时间戳转换为UTC时区的struct_time

<code>print</code><code>(time.gmtime(</code><code>1473525444.037215</code><code>))      </code><code>#结果time.struct_time(tm_year=2016, tm_mon=9, tm_mday=10, tm_hour=16, tm_min=37, tm_sec=24, tm_wday=5, tm_yday=254, tm_isdst=0)</code>

(3)将一个struct_time转化为时间戳

<code>print</code><code>(time.mktime(time.localtime()))       </code><code>#当前时间转换为时间戳1515302770.0</code>

(4)将一个struct_time转化为格式化的时间字符串

<code>print</code><code>(time.strftime(</code><code>"%Y-%m-%d %X"</code><code>, time.localtime()))   </code><code>#当前时间转换为格式化的时间字符串2018-01-07 13:34:20</code>

(5)将一个格式化的时间字符串转换为struct_time

<code>print</code><code>(time.strptime(</code><code>'2018-01-07 13:34:26'</code><code>, </code><code>'%Y-%m-%d %X'</code><code>))     </code><code>#time.struct_time(tm_year=2018, tm_mon=1, tm_mday=7, tm_hour=13, tm_min=34, tm_sec=26, tm_wday=6, tm_yday=7, tm_isdst=-1)</code>

(6)将一个格式化的时间字符串转换为时间戳

<code>print</code><code>(time.mktime(time.strptime(</code><code>'2018-01-07 13:34:26'</code><code>, </code><code>"%Y-%m-%d %H:%M:%S"</code><code>)))  </code><code>#结果1515303266.0</code>

(7)将时间戳转换为格式化的时间字符串

<code>a </code><code>=</code> <code>1515302770.0</code>

<code>b </code><code>=</code> <code>time.localtime(a)</code>

<code>print</code><code>(time.strftime(</code><code>"%Y-%m-%d %H:%M:%S"</code><code>, b))     </code><code>#结果2018-01-07 13:26:10</code>

3、把一个表示时间的元组或者struct_time表示为这种形式:'Sun Jun 20 23:21:05 1993'

<code>print</code><code>(time.asctime())       </code><code>#结果Sun Jan  7 14:03:39 2018</code>

<code>print</code><code>(time.ctime())          </code><code>#结果Sun Jan  7 14:03:39 2018</code>

4、模块datetime

6

7

8

9

10

<code>import</code> <code>datetime</code>

<code>print</code><code>(datetime.datetime.now()) </code><code>#返回 2018-01-07 14:08:16.536681</code>

<code>print</code><code>(datetime.date.fromtimestamp(time.time()) )  </code><code># 时间戳直接转成日期格式2018-01-07</code>

<code>print</code><code>(datetime.datetime.now() )                      </code><code>#2018-01-07 14:08:16.536681</code>

<code>print</code><code>(datetime.datetime.now() </code><code>+</code> <code>datetime.timedelta(</code><code>3</code><code>)) </code><code>#当前时间+3天</code>

<code>print</code><code>(datetime.datetime.now() </code><code>+</code> <code>datetime.timedelta(</code><code>-</code><code>3</code><code>)) </code><code>#当前时间-3天</code>

<code>print</code><code>(datetime.datetime.now() </code><code>+</code> <code>datetime.timedelta(hours</code><code>=</code><code>3</code><code>)) </code><code>#当前时间+3小时</code>

<code>print</code><code>(datetime.datetime.now() </code><code>+</code> <code>datetime.timedelta(minutes</code><code>=</code><code>30</code><code>)) </code><code>#当前时间+30分</code>

<code>c_time  </code><code>=</code> <code>datetime.datetime.now()</code>

<code>print</code><code>(c_time.replace(minute</code><code>=</code><code>3</code><code>,hour</code><code>=</code><code>2</code><code>)) </code><code>#时间替换,把当前时间分钟变为3,小时变为2,结果2018-01-07 02:03:16.536681</code>

二、 logging模块

1、日志级别

<code>CRITICAL </code><code>=</code> <code>50</code>

<code>ERROR </code><code>=</code> <code>40</code>

<code>WARNING </code><code>=</code> <code>30</code>   <code>#默认日志级别</code>

<code>INFO </code><code>=</code> <code>20</code>

<code>DEBUG </code><code>=</code> <code>10</code>

<code>NOTSET </code><code>=</code> <code>0</code>    <code>#不设置</code>

2、format参数中可能用到的格式化串说明

11

12

13

14

15

<code>%</code><code>(name)s:Logger的名字,并非用户名,详细查看</code>

<code>%</code><code>(levelno)s:数字形式的日志级别</code>

<code>%</code><code>(levelname)s:文本形式的日志级别</code>

<code>%</code><code>(pathname)s:调用日志输出函数的模块的完整路径名,可能没有</code>

<code>%</code><code>(filename)s:调用日志输出函数的模块的文件名</code>

<code>%</code><code>(module)s:调用日志输出函数的模块名</code>

<code>%</code><code>(funcName)s:调用日志输出函数的函数名</code>

<code>%</code><code>(lineno)d:调用日志输出函数的语句所在的代码行</code>

<code>%</code><code>(created)f:当前时间,用UNIX标准的表示时间的浮 点数表示</code>

<code>%</code><code>(relativeCreated)d:输出日志信息时的,自Logger创建以 来的毫秒数</code>

<code>%</code><code>(asctime)s:字符串形式的当前时间。默认格式是 “</code><code>2003</code><code>-</code><code>07</code><code>-</code><code>08</code> <code>16</code><code>:</code><code>49</code><code>:</code><code>45</code><code>,</code><code>896</code><code>”</code>

<code>%</code><code>(thread)d:线程</code><code>ID</code><code>。可能没有</code>

<code>%</code><code>(threadName)s:线程名。可能没有</code>

<code>%</code><code>(process)d:进程</code><code>ID</code><code>。可能没有</code>

<code>%</code><code>(message)s:用户输出的消息</code>

实例:日志打印到access.log文件里

<code>import</code> <code>logging</code>

<code>logging.basicConfig(filename</code><code>=</code><code>'access.log'</code><code>,</code>

<code>                    </code><code>format</code><code>=</code><code>'%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s'</code><code>,</code>

<code>                    </code><code>datefmt</code><code>=</code><code>'%Y-%m-%d %H:%M:%S %p'</code><code>,</code>

<code>                    </code><code>level</code><code>=</code><code>10</code><code>)</code>

<code>logging.debug(</code><code>'调试debug'</code><code>)</code>

<code>logging.info(</code><code>'消息info'</code><code>)</code>

<code>logging.warning(</code><code>'警告warn'</code><code>)</code>

<code>logging.error(</code><code>'错误error'</code><code>)</code>

<code>logging.critical(</code><code>'严重critical'</code><code>)</code>

3、logging模块的Formatter,Handler,Logger,Filter对象

    logger:产生日志的对象

    Filter:过滤日志的对象

    Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

    Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

4、输出日志流程

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>'''</code>

<code>critical=50</code>

<code>error =40</code>

<code>warning =30</code>

<code>info = 20</code>

<code>debug =10</code>

<code>(</code><code>1</code><code>)logger对象:负责产生日志,然后交给</code><code>Filter</code><code>过滤,然后交给不同的Handler输出</code>

<code>logger</code><code>=</code><code>logging.getLogger(__file__)</code>

<code>(</code><code>2</code><code>)</code><code>Filter</code><code>对象:不常用,略</code>

<code>(</code><code>3</code><code>)Handler对象:接收logger传来的日志,然后控制输出方式</code>

<code>h1</code><code>=</code><code>logging.FileHandler(</code><code>'t1.log'</code><code>) </code><code>#打印到文件</code>

<code>h2</code><code>=</code><code>logging.FileHandler(</code><code>'t2.log'</code><code>) </code><code>#打印到文件</code>

<code>h3</code><code>=</code><code>logging.StreamHandler() </code><code>#打印到终端</code>

<code>(</code><code>4</code><code>)Formatter对象:日志格式</code>

<code>formmater1</code><code>=</code><code>logging.Formatter(</code><code>'%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s'</code><code>,</code>

<code>                    </code><code>datefmt</code><code>=</code><code>'%Y-%m-%d %H:%M:%S %p'</code><code>,)</code>

<code>formmater2</code><code>=</code><code>logging.Formatter(</code><code>'%(asctime)s :  %(message)s'</code><code>,</code>

<code>formmater3</code><code>=</code><code>logging.Formatter(</code><code>'%(name)s %(message)s'</code><code>,)</code>

<code>(</code><code>5</code><code>)为Handler对象绑定格式</code>

<code>h1.setFormatter(formmater1)</code>

<code>h2.setFormatter(formmater2)</code>

<code>h3.setFormatter(formmater3)</code>

<code>(</code><code>6</code><code>)将Handler添加给logger并设置日志级别</code>

<code>logger.addHandler(h1)</code>

<code>logger.addHandler(h2)</code>

<code>logger.addHandler(h3)</code>

<code>logger.setLevel(</code><code>10</code><code>)</code>

<code>(</code><code>7</code><code>)测试</code>

<code>logger.debug(</code><code>'debug'</code><code>)</code>

<code>logger.info(</code><code>'info'</code><code>)</code>

<code>logger.warning(</code><code>'warning'</code><code>)</code>

<code>logger.error(</code><code>'error'</code><code>)</code>

<code>logger.critical(</code><code>'critical'</code><code>)</code>

5、设置级别

logger是第一级过滤,然后才能到handler,我们可以给logger和handler同时设置level,但是需要注意的是:

logger的级别小于等于handler的级别,否则日志会在logger时就被过滤

6、logger应用

(1)logging配置文件

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<code>import</code> <code>os</code>

<code>import</code> <code>logging.config</code>

<code>standard_format </code><code>=</code> <code>'[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'</code> <code>\</code>

<code>                  </code><code>'[%(levelname)s][%(message)s]'</code> <code>#其中name为getlogger指定的名字</code>

<code>simple_format </code><code>=</code> <code>'[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'</code>

<code>id_simple_format </code><code>=</code> <code>'[%(levelname)s][%(asctime)s] %(message)s'</code>

<code>logfile_dir </code><code>=</code> <code>os.path.dirname(os.path.abspath(__file__))  </code><code># log文件的目录</code>

<code>logfile_name </code><code>=</code> <code>'access.log'</code>  <code># log文件名</code>

<code># 如果不存在定义的日志目录就创建一个</code>

<code>if</code> <code>not</code> <code>os.path.isdir(logfile_dir):</code>

<code>    </code><code>os.mkdir(logfile_dir)</code>

<code>logfile_path </code><code>=</code> <code>os.path.join(logfile_dir, logfile_name)</code>

<code># log配置字典</code>

<code>LOGGING_DIC </code><code>=</code> <code>{</code>

<code>    </code><code>'version'</code><code>: </code><code>1</code><code>,</code>

<code>    </code><code>'disable_existing_loggers'</code><code>: </code><code>False</code><code>,</code>

<code>    </code><code>'formatters'</code><code>: {</code>

<code>        </code><code>'standard'</code><code>: {</code>

<code>            </code><code>'format'</code><code>: standard_format</code>

<code>        </code><code>},</code>

<code>        </code><code>'simple'</code><code>: {</code>

<code>            </code><code>'format'</code><code>: simple_format</code>

<code>    </code><code>},</code>

<code>    </code><code>'filters'</code><code>: {},</code>

<code>    </code><code>'handlers'</code><code>: {</code>

<code>        </code><code>#打印到终端的日志</code>

<code>        </code><code>'console'</code><code>: {</code>

<code>            </code><code>'level'</code><code>: </code><code>'DEBUG'</code><code>,</code>

<code>            </code><code>'class'</code><code>: </code><code>'logging.StreamHandler'</code><code>,  </code><code># 打印到屏幕</code>

<code>            </code><code>'formatter'</code><code>: </code><code>'simple'</code>

<code>        </code><code>#打印到文件的日志,收集info及以上的日志</code>

<code>        </code><code>'default'</code><code>: {</code>

<code>            </code><code>'class'</code><code>: </code><code>'logging.handlers.RotatingFileHandler'</code><code>,  </code><code># 保存到文件</code>

<code>            </code><code>'formatter'</code><code>: </code><code>'standard'</code><code>,</code>

<code>            </code><code>'filename'</code><code>: logfile_path,  </code><code># 日志文件</code>

<code>            </code><code>'maxBytes'</code><code>: </code><code>1024</code><code>*</code><code>1024</code><code>*</code><code>5</code><code>,  </code><code># 日志大小 5M</code>

<code>            </code><code>'backupCount'</code><code>: </code><code>5</code><code>,</code>

<code>            </code><code>'encoding'</code><code>: </code><code>'utf-8'</code><code>,  </code><code># 日志文件的编码,再也不用担心中文log乱码了</code>

<code>    </code><code>'loggers'</code><code>: {</code>

<code>        </code><code>#logging.getLogger(__name__)拿到的logger配置</code>

<code>        </code><code>'': {</code>

<code>            </code><code>'handlers'</code><code>: [</code><code>'default'</code><code>, </code><code>'console'</code><code>],  </code><code># 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕</code>

<code>            </code><code>'propagate'</code><code>: </code><code>True</code><code>,  </code><code># 向上(更高level的logger)传递</code>

<code>}</code>

<code>def</code> <code>load_my_logging_cfg():</code>

<code>    </code><code>logging.config.dictConfig(LOGGING_DIC)  </code><code># 导入上面定义的logging配置</code>

<code>    </code><code>logger </code><code>=</code> <code>logging.getLogger(__name__)  </code><code># 生成一个log实例</code>

<code>    </code><code>logger.info(</code><code>'It works!'</code><code>)  </code><code># 记录该文件的运行状态</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>load_my_logging_cfg()</code>

(2)logger使用

<code>import</code> <code>my_logging  </code><code># 导入自定义的logging配置</code>

<code>logger </code><code>=</code> <code>logging.getLogger(__name__)  </code><code># 生成logger实例</code>

<code>def</code> <code>demo():</code>

<code>    </code><code>logger.debug(</code><code>"start range... time:{}"</code><code>.</code><code>format</code><code>(time.time()))</code>

<code>    </code><code>logger.info(</code><code>"中文测试开始。。。"</code><code>)</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>10</code><code>):</code>

<code>        </code><code>logger.debug(</code><code>"i:{}"</code><code>.</code><code>format</code><code>(i))</code>

<code>        </code><code>time.sleep(</code><code>0.2</code><code>)</code>

<code>    </code><code>else</code><code>:</code>

<code>        </code><code>logger.debug(</code><code>"over range... time:{}"</code><code>.</code><code>format</code><code>(time.time()))</code>

<code>    </code><code>logger.info(</code><code>"测试结束。。。"</code><code>)</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>

<code>    </code><code>my_logging.load_my_logging_cfg()  </code><code># 在你程序文件的入口加载自定义logging配置</code>

<code>    </code><code>demo()</code>

三、re模块(正则模块)

1、正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。

2、正则表达式元字符说明

.    匹配除换行符以外的任意字符

^    匹配字符串的开始

$    匹配字符串的结束

[]   用来匹配一个指定的字符类别

?   对于前一个字符字符重复0次到1次

*    对于前一个字符重复0次到无穷次

{}   对于前一个字符重复m次

{m,n} 对前一个字符重复为m到n次

\d   匹配数字,相当于[0-9]

\D   匹配任何非数字字符,相当于[^0-9]

\s   匹配任意的空白符,相当于[ fv]

\S   匹配任何非空白字符,相当于[^ fv]

\w   匹配任何字母数字字符,相当于[a-zA-Z0-9_]

\W   匹配任何非字母数字字符,相当于[^a-zA-Z0-9_]

\b   匹配单词的开始或结束,print(re.findall(r'er\b','never hello word 123'))

3、正则匹配

<code>import</code> <code>re</code>

<code>#\w与\W</code>

<code>print</code><code>(re.findall(</code><code>'\w'</code><code>,</code><code>'hello\t word\n 123'</code><code>)) </code><code>#['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'd', '1', '2', '3']</code>

<code>print</code><code>(re.findall(</code><code>'\W'</code><code>,</code><code>'hello\t egon\n 123'</code><code>)) </code><code>#['\t', ' ', '\n', ' ']</code>

<code>#\s与\S</code>

<code>print</code><code>(re.findall(</code><code>'\s'</code><code>,</code><code>'hello\t word\n 123'</code><code>))  </code><code>#['\t', ' ', '\n', ' '],\n \t都是空,都可以被\s匹配</code>

<code>print</code><code>(re.findall(</code><code>'\S'</code><code>,</code><code>'hello\t word\n 123'</code><code>))  </code><code>#['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'd', '1', '2', '3']</code>

<code>#\n与\t</code>

<code>print</code><code>(re.findall(</code><code>'\n'</code><code>,</code><code>'hello\t word\n 123'</code><code>))   </code><code>#['\n']</code>

<code>print</code><code>(re.findall(</code><code>'\t'</code><code>,</code><code>'hello\t word\n 123'</code><code>))   </code><code>#['\t']</code>

<code>#\d与\D</code>

<code>print</code><code>(re.findall(</code><code>'\d'</code><code>,</code><code>'hello\t word\n 123'</code><code>))  </code><code>#['1', '2', '3']</code>

<code>print</code><code>(re.findall(</code><code>'\D'</code><code>,</code><code>'hello\t word\n 123'</code><code>))   </code><code>#['h', 'e', 'l', 'l', 'o', '\t', ' ', 'w', 'o', 'r', 'd', '\n', ' ']</code>

<code>#\A与\Z</code>

<code>print</code><code>(re.findall(</code><code>'\Ahe'</code><code>,</code><code>'hello\t word\n 123'</code><code>))  </code><code>#['he'],相当于^</code>

<code>print</code><code>(re.findall(</code><code>'123\Z'</code><code>,</code><code>'hello\t word\n 123'</code><code>))  </code><code>#['123'],相当于$</code>

<code>#^与$</code>

<code>print</code><code>(re.findall(</code><code>'\Ah'</code><code>,</code><code>'hello\t word\n 123'</code><code>))   </code><code>#['h']</code>

<code>print</code><code>(re.findall(</code><code>'123\Z'</code><code>,</code><code>'hello\t word\n 123'</code><code>)) </code><code>#['123']</code>

4、重复匹配:| . | * | ? | .* | .*? | + | {n,m} |

<code>#.</code>

<code>print</code><code>(re.findall(</code><code>'a.b'</code><code>,</code><code>'a1b a*b a b aaab'</code><code>)) </code><code>#['a1b', 'a*b', 'a b', 'aab']</code>

<code>print</code><code>(re.findall(</code><code>'a.b'</code><code>,</code><code>'a\nb'</code><code>))       </code><code>#[],不匹配换行符</code>

<code>print</code><code>(re.findall(</code><code>'a.b'</code><code>,</code><code>'a\nb'</code><code>,re.S))  </code><code>#['a\nb']</code>

<code>print</code><code>(re.findall(</code><code>'a.b'</code><code>,</code><code>'a\nb'</code><code>,re.DOTALL)) </code><code>#['a\nb']同上一条意思一样</code>

<code>#*</code>

<code>print</code><code>(re.findall(</code><code>'ab*'</code><code>,</code><code>'abbbb bbbbbbb a'</code><code>)) </code><code>#['abbbb', 'a']</code>

<code>#?</code>

<code>print</code><code>(re.findall(</code><code>'ab?'</code><code>,</code><code>'abbb a bbbbbb'</code><code>)) </code><code>#['ab', 'a']</code>

<code>#匹配所有包含小数在内的数字</code>

<code>print</code><code>(re.findall(</code><code>'\d+\.?\d*'</code><code>,</code><code>"adf123as1.13dfa12adsf1asdf3"</code><code>)) </code><code>#['123', '1.13', '12', '1', '3']</code>

<code>#.* 默认为贪婪匹配</code>

<code>print</code><code>(re.findall(</code><code>'a.*b'</code><code>,</code><code>'a1b22222222b'</code><code>)) </code><code>#['a1b22222222b']</code>

<code>#.*? 为非贪婪匹配:推荐使用</code>

<code>print</code><code>(re.findall(</code><code>'a.*?b'</code><code>,</code><code>'a1b22222222b'</code><code>)) </code><code>#['a1b']</code>

<code>#+</code>

<code>print</code><code>(re.findall(</code><code>'ab+'</code><code>,</code><code>'a'</code><code>)) </code><code>#[]</code>

<code>print</code><code>(re.findall(</code><code>'ab+'</code><code>,</code><code>'abbb a ab'</code><code>)) </code><code>#['abbb', 'ab']</code>

<code>#{n,m} 指定匹配字符的次数</code>

<code>print</code><code>(re.findall(</code><code>'ab{2}'</code><code>,</code><code>'abbb'</code><code>)) </code><code>#['abb']</code>

<code>print</code><code>(re.findall(</code><code>'ab{2,4}'</code><code>,</code><code>'abbb'</code><code>)) </code><code>#['abb']</code>

<code>print</code><code>(re.findall(</code><code>'ab{1,}'</code><code>,</code><code>'abbb'</code><code>)) </code><code>#'ab{1,}',匹配ab,其中b至少有1个,相当于 'ab+'</code>

<code>print</code><code>(re.findall(</code><code>'ab{0,}'</code><code>,</code><code>'abbb'</code><code>)) </code><code>#'ab{0,}' ,匹配ab,其中b可以没有,也可以有多个,'ab*'</code>

<code>#[]</code>

<code>print</code><code>(re.findall(</code><code>'a[1*-]b'</code><code>,</code><code>'a1b a*b a-b'</code><code>)) </code><code>#[]内的都为普通字符了,且如果-没有被转意的话,应该放到[]的开头或结尾,['a1b', 'a*b', 'a-b']</code>

<code>print</code><code>(re.findall(</code><code>'a[^1*-]b'</code><code>,</code><code>'a1b a*b a-b a=b'</code><code>)) </code><code>#[]内的^代表的意思是取反,所以结果为['a=b']</code>

<code>print</code><code>(re.findall(</code><code>'a[a-z]b'</code><code>,</code><code>'a1b a*b a-b a=b aeb'</code><code>)) </code><code>#结果为['aeb']</code>

<code>print</code><code>(re.findall(</code><code>'a[a-zA-Z]b'</code><code>,</code><code>'a1b a*b a-b a=b aeb aEb'</code><code>)) </code><code>#['aeb', 'aEb']</code>

<code>print</code><code>(re.findall(r</code><code>'a\\c'</code><code>,</code><code>'a\c'</code><code>)) </code><code>#r代表告诉解释器使用rawstring,即原生字符串,把我们正则内的所有符号都当普通字符处理,不要转义,['a\\c']</code>

<code>#():分组</code>

<code>print</code><code>(re.findall(</code><code>'ab+'</code><code>,</code><code>'ababab123'</code><code>)) </code><code>#['ab', 'ab', 'ab']</code>

<code>print</code><code>(re.findall(</code><code>'(ab)+123'</code><code>,</code><code>'ababab123'</code><code>)) </code><code>#['ab'],匹配到末尾的ab123中的ab</code>

<code>print</code><code>(re.findall(</code><code>'(?:ab)+123'</code><code>,</code><code>'ababab123'</code><code>)) </code><code>#findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容</code>

<code>print</code><code>(re.findall(</code><code>'href="(.*?)"'</code><code>,</code><code>'&lt;a href="http://www.baidu.com"&gt;点击&lt;/a&gt;'</code><code>))</code><code>#['http://www.baidu.com']</code>

<code>print</code><code>(re.findall(</code><code>'href="(?:.*?)"'</code><code>,</code><code>'&lt;a href="http://www.baidu.com"&gt;点击&lt;/a&gt;'</code><code>))</code><code>#['href="http://www.baidu.com"']</code>

<code>#|</code>

<code>print</code><code>(re.findall(</code><code>'compan(?:y|ies)'</code><code>,</code><code>'companies my company comparies'</code><code>))   </code><code>#结果是['companies', 'company']</code>

5、re模块提供的方法介绍

<code>print</code><code>(re.findall(</code><code>'e'</code><code>,</code><code>'make love'</code><code>) )      </code><code>#['e', 'e'],返回所有满足匹配条件的结果,放在列表里</code>

<code>print</code><code>(re.search(</code><code>'e'</code><code>,</code><code>'make love'</code><code>).group()) </code><code>#e,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。</code>

<code>print</code><code>(re.match(</code><code>'e'</code><code>,</code><code>'alex make love'</code><code>))    </code><code>#None,同search,不过在字符串开始处进行匹配,完全可以用search+^代替match</code>

<code>print</code><code>(re.split(</code><code>'[ab]'</code><code>,</code><code>'abcd'</code><code>))            </code><code>#['', '', 'cd'],先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割</code>

<code>print</code><code>(re.sub(</code><code>'a'</code><code>,</code><code>'A'</code><code>,</code><code>'alex make love'</code><code>))     </code><code>#Alex mAke love,不指定n,默认替换所有</code>

<code>print</code><code>(re.sub(</code><code>'a'</code><code>,</code><code>'A'</code><code>,</code><code>'alex make love'</code><code>,</code><code>1</code><code>))    </code><code>#Alex make love,最后的1指的是替换的个数</code>

<code>print</code><code>(re.sub(</code><code>'^(\w+)(.*?\s)(\w+)(.*?\s)(\w+)(.*?)$'</code><code>,r</code><code>'\5\2\3\4\1'</code><code>,</code><code>'alex make love'</code><code>)) </code><code>#love make alex</code>

<code>print</code><code>(re.subn(</code><code>'a'</code><code>,</code><code>'A'</code><code>,</code><code>'alex make love'</code><code>))    </code><code>#('Alex mAke love', 2),结果带有总共替换的个数</code>

<code>obj</code><code>=</code><code>re.</code><code>compile</code><code>(</code><code>'\d{2}'</code><code>)</code>

<code>print</code><code>(obj.search(</code><code>'abc123eeee'</code><code>).group())   </code><code>#12</code>

<code>print</code><code>(obj.findall(</code><code>'abc123eeee'</code><code>))           </code><code>#['12'],重用了obj</code>

本文转自 宋鹏超 51CTO博客,原文链接:http://blog.51cto.com/qidian510/2058382,如需转载请自行联系原作者