ITPub博客

首页 > 应用开发 > Python > 【Python | 边敲边学边记】第一次:正则表达式

【Python | 边敲边学边记】第一次:正则表达式

原创 Python 作者:极简XksA 时间:2018-10-12 17:00:55 0 删除 编辑


一、前言

最近想了很多,和学长学姐、做公众号认识的一些读研的、工作的朋友也谈了很多,我的疑问是:我到底该做什么?(面对诸多的不如意、不尽人意),交谈思考中也得到了很多结论:

关于公众号:

1.公众号要继续做下去,我的初心是学习分享,不忘初心就好;(每周更新2-3篇学习笔记,以后更注重内容、质量,排班花费再多时间,没用)

2.在没学到真正本领前,不会再自己开发杂代码的热点模块,资源分享的学习干货模块会持续开发;

3.公众号以后主要开发的模块:边学边敲边记和学习干货;

关于自己:

1.提升自身学习本领,不能再东一棒槌,西一榔头了,不要浮于表面的虚荣;

2.学Python就坚持走下去,现在存储的知识不多不少,时间也不多不少,不过还有很多东西没做,加把劲;

3.8月22日左右出四级成绩,看运气,没过,好好准备,下次必过;过了,好好准备六级,大三四、六级一定得过,普通话,大三上学期好好练习;

4.考研,这个是躲不掉的,大家都说得很好,把技术学好,毕业出去拿个10-20k工资很简单,其实有误区的,自己好好想想“技术学好”的概念是什么?我们这个行业,10-20k在大城市打拼又算什么?而且这样的人,可能一个班就能有2-3个;

5.实训给我启发也很大,我不能只做程序员,至于做什么,我还在思考;

6.比较重要的一点:以后尽量少用手机,多买书、看书;

7.考研、创业、课外学习,不冲突,坚持。

上面这些话,也是我开设“边敲边学边记”这个模块的原因; 接下来给大家分享的是前几天的了解正则表达式的学习笔记。

二、正则表达式介绍

1.学习爬虫,为什么必须会正则表达式?
    有时候,我们爬取一些网页具体内容时,会发现我们只需要这个网页某个标签的一部分内容,或者是这个标签的某个属性的值时,用普通的 xpath 或者css.selector是不能实现我们的想法的,这个时候就必须用到正则表达式去匹配获取。
2.正则表达式官方简介?
    正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

三、看代码,边学边敲边记正则表达式

day01:



 1


'''

2 author : 极简XksA
3 date : 2018.7.27
4 goal : 正则表达式
5 '''

6
7 import  re
8
9 line =  'jijianXksA123'
10
11 # ^a 表示匹配以a开头的字符串(只匹配一次)
12 # . 表示该字符可为任意字符(只匹配一次)
13 # * 表示前面的字符可以出现任意次(0次或多次)(多次匹配)
14 reg_str01 =  '^j.*'      # 表示以j开头的字符串
15 # re.match 函数
16 # 第一个参数是匹配的格式
17 # 第二参数是要匹配的字符串
18 # 返回值为:匹配成功,返回match对象,否则返回:None
19
20 if  re.match(reg_str01,line) :
21     print( "匹配成功!" )   # reg_str = '^j.*'     匹配成功
22 else :
23     print( "匹配失败!" )   # reg_str = '^i.*'     匹配失败
24
25
26 # 23$ 表示匹配以23结尾的字符串(只匹配一次)
27 reg_str02 =  '^j.*23$'
28 if  re.match(reg_str02,line) :
29     print( "匹配成功!" )   # reg_str = '^j.*23$'     匹配成功
30 else :
31     print( "匹配失败!" )   # reg_str = '^j.*13$'     匹配失败
32
33
34 line01 =  'boooboaobxby'
35 # () 内的为 匹配模式,通过 group函数 可以取出匹配结果
36 # 正则表达式贪婪匹配模式:从后面(右边)开始匹配
37 reg_str03 =  '.*(b.*b).*'
38 test01 = re.match(reg_str03,line01)
39 if   test01:
40     print(test01.group( 1 ))       # result : bxb
41 else :
42     print( "匹配失败!" )
43
44 # 正则表达式非贪婪匹配模式:从前面(左边)开始匹配
45 # ? : 表示从左边开始匹配,匹配到第一个符合模式的内容,即进入模式
46 #
47 reg_str03 =  '.*?(b.*b).*'     # 半贪婪匹配
48 reg_str04 =  '.*?(b.*?b).*'    # 非贪婪匹配
49 test01 = re.match(reg_str03,line01)
50 test02 = re.match(reg_str04,line01)
51 if   test01  and  test02:
52     print(test01.group( 1 ))       # result : boooboaobxb
53     print(test02.group( 1 ))   # result : booob
54 else :
55     print( "匹配失败!" )

day02:



 1


'''

2 author : 极简XksA
3 date : 2018.7.28
4 goal : 正则表达式
5 '''

6 import  re
7 line01 =  'boooboaobcxby'
8
9 def   regtest (reg_str,line = line01) :
10     test = re.match(reg_str, line)
11      if  test:
12         print(test.group( 1 ))
13      else :
14         print( "匹配失败!" )
15
16 # + :表示前面的字符,至少出现一次
17 reg_str04 =  '.*(b.+b).*'    # (b.+b)表示b与b之间至少有一个字符
18 regtest(reg_str04)       # result : bcxb
19
20 # {n} : 控制前面字符出现次数
21 # a{2} : 表示a出现两次
22 # b{3,4} : 表示b至少出现3次,最多出4次
23 # c{4,} : 表示c至少出现4次
24 reg_str05 =  '.*(b.{2}b).*'    # (b.{2}b)表示匹配到的b与b之间,只有两字符
25 reg_str06 =  '.*(b.{3,4}b).*'    # (b.{3,6}b)表示匹配到的b与b之间,至少有3个字符,至多有4个字符
26 reg_str07 =  '.*(b.{4,}b).*'    # (b.{8,}b)表示匹配到的b与b之间,至少有4个字符
27 regtest(reg_str05)    # result : bcxb
28 regtest(reg_str06)    # result : boaob
29 regtest(reg_str07)    # result : boaobcxb
30
31 # | :表示 或
32 # (abc|123) : 表示匹配到 abc 或者 123,都算匹配成功
33 reg_str08 =  '.*(boo|abc)'
34 reg_str09 =  '.*(abc|boo)'
35 regtest(reg_str08)    # result : boo
36 regtest(reg_str09)    # result : boo
37
38 # [] : 表示 里面包含的内容都可以进行匹配,包含内容只有表面字符含义
39 # [abcd] : 表示 只要这个字符为 a/b/c/d中的一个都可以匹配成功
40 # [0-9] : 表示 只要这个字符在 0-9 这个区间内,都可以匹配成功
41 # [^x] : 表示匹配 字符不为 x
42 line02 =  '电话号:15573563467'
43 reg_str10 =  '.*(1[3458][0-9]{9}).*'
44 reg_str11 =  '.*(1[3458][^1]{9}).*'
45 regtest(reg_str10,line02)    # result : 15573563467
46 regtest(reg_str11,line02)    # result : 15573563467
47
48 # \s 表示匹配空格,匹配一次
49 # \S 表示匹配不是空格的字符,匹配一次
50 # \w 表示匹配 A-Z、0-9、_ 中的容易字符,匹配一次
51 # \W 与 \w 相反
52 # \d 表示数字
53 # [\u4E00-\u9FA5] : 表示所有汉字,unicode 编码
54
55 def   regtest_test (reg_str,line = line01) :
56     test = re.match(reg_str, line)
57      if  test:
58         print(test.group( 1 )+ ':' +test.group( 2 )+ '-' +test.group( 3 )+ '-' +test.group( 4 ))
59      else :
60         print( "匹配失败!" )
61
62 # 简单实例
63 str01 =  '张三出生于1997年12月20日'
64 str02 =  '李四出生于1989-01-20'
65 str03 =  '王五出生于1997/2/5'
66 str04 =  '赵六出生于1997.12.20'
67 str = [str01,str02,str03,str04]
68 # 提取出姓名+出生日期
69 # 匹配模式
70 reg_str12 =  '(.*)出生于(\d{4})[.年/-](\d{1,2})[.月/-](\d{1,2}).*?'
71 for  i  in  range( 4 ):
72     regtest_test(reg_str12,str[i])
73 # result :
74 #       张三:1997-12-20
75 #       李四:1989-01-20
76 #       王五:1997-2-5
77 #       赵六:1997-12-20

四、后言

边敲边学边做,坚持学习分享。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31556503/viewspace-2216248/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
极简XksA,专注于学习笔记分享,学习资源分享,目前笔者X先生主要学习研究Python数据分析可视化和数据挖掘,目标:人工智能学习,欢迎大家关注微信公众号:极简XksA,一起交流学习。

注册时间:2018-09-27

  • 博文量
    12
  • 访问量
    4397