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