【0825 | Day 22】re模块
re模块
一、什么是正则
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。
二、常用匹配模式
import re
s = '王大炮打炮被大炮打死了 王大炮打炮被大炮打死了'
- print(s[1:3], s[6:8]) #大炮 大炮
- print(re.findall('大.', s)) #['大炮', '大炮', '大炮', '大炮']
- print(re.findall('^王大炮', s)) #^: 开头 #['王大炮'] #开头不是就空列表
- print(re.findall('死了$', s)) #$: 结尾 #['死了'] ##开头不是就空列表
s = 'acefghjkacefsdfsdaf'
- print(re.findall('[acef]', s)) # 只要单个字符 #['a', 'c', 'e', 'f', 'a', 'c', 'e', 'f', 'f', 'a', 'f']
- print(re.findall('[^acef]', s)) #[]+^联用: ^对[]内的元素取反 #['g', 'h', 'j', 'k', 's', 'd', 's', 'd']
- print(re.findall('a..', s)) #.: 任意字符(除了\n) #['ace', 'ace'] #注意最后'af'只有两位,不够就不取
s = 'abaacaaaaa'
- print(re.findall('a*', s)) # *: 前面的字符0-无穷个 #['a', '', 'aa', '', 'aaaaa', ''] #非‘a’以空表示
- print(re.findall('a+', s)) # +: 前面的字符1-无穷个 #['a', 'aa', 'aaaaa'] #非'a'就不表示
- print(re.findall('a?', s)) # ?: 前面的字符0-1个 #['a', '', 'a', 'a', '', 'a', 'a', 'a', 'a', 'a', '']
- print(re.findall('a{5}', s)) # {m}: 前面的字符m个 #['aaaaa']
- print(re.findall('a{2,5}', s)) # {n,m}: 前面的字符2-3个 # 'abaacaaaaa'
# a aa aaa aa
s = 's 1 s+\n=$\t2_s 3'
- print(re.findall('\d', s)) # \d: 数字 #['1', '2', '3']
- print(re.findall('\D', s)) # \D: 非数字 #['s', ' ', ' ', ' ', ' ', ' ', 's', '+', '\n', '=', '$', '\t', '_', 's', ' ', ' ']
- print(re.findall('\w', s)) # \w: 数字/字母/下划线 #['s', '1', 's', '2', '_', 's', '3']
- print(re.findall('\W', s)) # \W: 非数字/字母/下划线 #[' ', ' ', ' ', ' ', ' ', '+', '\n', '=', '$', '\t', ' ', ' ']
- print(re.findall('\s', s)) # \s: 空格/\t/\n #[' ', ' ', ' ', ' ', ' ', '\n', '\t', ' ', ' ']
- print(re.findall('\S', s)) # \S: 非空格/\t/\n #['s', '1', 's', '+', '=', '$', '2', '_', 's', '3']
s = 'aba\d'
- print(re.findall(r'a\d', s)) # []
- print(re.findall(r'a\\d', s)) # \: 取消意义 #['a\\d']
s = 'abbbcabc'
- print(re.findall('a.*c', s)) # .*: 贪婪模式(最大化),找到继续找,让结果最大化 #['abbbcabc']
- print(re.findall('a.*?c', s)) ## .*?: 非贪婪模式(最小化),找到就马上停止 #['abbbc', 'abc']
s = 'abacad'
- print(re.findall('a(.)', s)) # (): 只要括号内的 #['b', 'c', 'd']
s = 'abacad'
- print(re.findall('a|b', s)) # A|B: A和B都要 #['a', 'b', 'a', 'a']
三、re模块的方法
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
s = 'abc123\ndef456'
- print(re.findall('3.', s, re.S)) #['3\n']
- print(re.findall('\d+', s)) #['123', '123', '456']
s = '123abc123\ndef456'
- res = re.match('\d+', s) # re.mathch(): 从开头搜索,搜索到最后一个数字停下来,没搜索到就是none
- print(res) #<re.Match object; span=(0, 3), match='123'>
- print(res.group()) #123
- res = re.search('\d+', s) # re.search(): 搜索第一个匹配结果,找到了就不找了
- print(res) #<re.Match object; span=(0, 3), match='123'>
- print(res.group()) #123
s = 'abc324asdfk234lkjsf324lkj'
- print(re.split('\d+', s1)) # re.split(): 按照匹配规则切割 #['abc', 'asdfk', 'lkjsf', 'lkj']
- print(' '.join(re.split('\d+', s))) #abc asdfk lkjsf lkj
- print(re.sub('\d+', '***', s1)) # re.subn(): 按照匹配规则替换,并计数 #abc***asdfk***lkjsf***lkj
s = 'abc123edf456'
- res = re.search('abc(?P<abc>\d+)edf(?P<edf>\d+)', s)
- print(res.groupdict()) # 分组: 一个括号里的叫一个分组, django #{'abc': '123', 'edf': '456'}