一、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>'<a href="http://www.baidu.com">点击</a>'</code><code>))</code><code>#['http://www.baidu.com']</code>
<code>print</code><code>(re.findall(</code><code>'href="(?:.*?)"'</code><code>,</code><code>'<a href="http://www.baidu.com">点击</a>'</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,如需转载请自行联系原作者