re模块

 1 # re模块下的常用方法
 2 # 重要的方法
 3     # findall
 4         # 第一个参数为正则表达式,第二个参数为被匹配的内容
 5         # 第三个参数flags有很多可选值
 6           #   re.I   忽略大小写
 7           # re.M 多行模式,改变^和$的行为
 8           # re.S 点可以匹配任意字符,包括换行符
 9           # re.L 做本地化识别的匹配,表示特殊字符集\w,\W,\b,\B,\s,\S,依赖于当前环境,不推荐使用
10           # re.U 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python中默认使用该flag
11           # re.X 冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
12     # search
13         # 从前往后,找到一个符合正则表达式的就返回,返回的是一个对象,返回的这个对象调用group()才能得到结果
14         # search找不到会返回None。
15     # match
16         # 是从头开始匹配,如果正则表达式中从头开始可以匹配上,则会返回一个对象。调用这个对象的group()才能得到匹配的内容
17         # 如果找不到则会返回None
18 
19 import re
20 
21 ret = re.findall('a', 'eva egon yuan')  # 返回所有满足匹配条件的结果,结果放在列表
22 print(ret)  # ['a', 'a']
23 
24 ret = re.search('a', 'eva egon yuan')   # 从前往后,找到一个符合正则表达式的就返回,找到会返回一个对象
25 if ret != None:
26     print(ret.group())  # 调用group得到结果   a
27 
28 ret = re.match('eva', 'eva egon yuan')  # 是从头开始匹配,如果正则表达式中从头开始可以匹配上,则会返回一个对象
29 if ret != None:
30     print(ret.group())  # 调用这个对象的group()才能得到匹配的内容  eva
31 
32 
33 
34 ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和bcd,在对''和'bcd'分别按'b'分割,则又得到了''和cd
35 print(ret)  # ['', '', 'cd']
36 
37 ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)
38 # 将eva3egon4yuan4这个要匹配的字符串,按照\d正则去匹配(只匹配数字),匹配到后将数字替换成H,但只替换一个,然后将新的字符串内容返回
39 print(ret)  # evaHegon4yuan4
40 
41 ret = re.subn('\d', 'H', 'eva3egon4yuan4')
42 # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
43 print(ret)  # ('evaHegonHyuanH', 3)
44 
45 obj = re.compile('\d{3}')   # 将正则表达式代码编译成一个正则表达式对象。匹配规则是3个数字
46 ret = obj.search('abc123eeee')  #这样就不用在写规则了,而是只写被匹配的内容就可以了
47 print(ret.group())  # 123
48 
49 ret = re.finditer('\d', 'ds3sy4784a')   # 得到一个迭代器对象
50 for i in ret:   # 拿到的i不是匹配的结果内容,而是一个对象,在执行group才能拿到结果内容
51     print(i.group())  #
52 
53 
54 ret = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$', '22050319991007223x')
55 if ret != None:
56     print(ret.group(1)) # 23x    # 这样可以取到正则表达式分组中的规则所匹配到的内容.
57 
58 # 正则表达中的分组中在括号开始的位置加上?P<id>意思是给这个分组起了一个名字叫做id,匹配上后可以通过group('id')找到这个分组匹配出来的内容
59 ret = re.search('^[1-9]\d{14}(?P<id>\d{2}[0-9x])?$', '22050319991007223x')
60 if ret != None:
61     print(ret.group('id'))  # 23x    # 这样可以取到正则表达式分组中的规则所匹配到的内容.
62 
63 # 注意的点
64 
65 # findall的优先级查询
66     # 会优先匹配正则表达式分组中的,如果所要匹配的内容中在分组的正则式中匹配上了,则只返回正则分组中匹配上的内容
67 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
68 print(ret)  # ['oldboy']
69 
70 # findall   取消分组优先, 在分组括号开始的位置加上?:
71     # 会优先匹配正则表达式分组中的,如果所要匹配的内容中在分组的正则式中匹配上了,则只返回正则分组中匹配上的内容
72 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
73 print(ret)  # ['www.oldboy.com']
74 
75 # split的优先级查询
76     # 如果split中的正则表达式中有了分组,则会将被切割本身的内容保留
77 ret = re.split('\d+', 'eva3egon4yuan')
78 print(ret)  # ['eva', 'egon', 'yuan']
79 
80 ret = re.split('(\d+)', 'eva3egon4yuan')    # 如果split中的正则表达式中有了分组,则会将被切割本身的内容保留
81 print(ret)  # ['eva', '3', 'egon', '4', 'yuan']
82 
83 # 取消split中正则表达式中如果有了分组而特殊对待的机制
84 ret = re.split('(?:\d+)', 'eva3egon4yuan')    # 如果split中的正则表达式中有了分组,但分组开始有了?:则被切割本身的内容还是如正常的一样消失
85 print(ret)  # ['eva', 'egon', 'yuan']

 

# ?P=tag_name   必须和前面?P<tag_name>分组中匹配的一样
ret = re.search('<(?P<tag_name>\w+)>\w+</(?P=tag_name)', '<h1>hello</h1>')
if ret != None:
    print(ret.group('tag_name'))  # h1

 

posted @ 2018-09-22 21:19  _小溢  阅读(209)  评论(0)    收藏  举报