re模块
从字符串里找到特定的字符
re的基本语法(匹配规则)
import re
s = '王大炮打炮被大炮打死了 王大炮打炮被大炮打死了'
# 0 1 2 3 4 5 6 7 8 9 10
# print(s[1:3], s[6:8])
# res = re.findall('大.',s)
# print(res)
# ^: 开头
print(re.findall('^王大炮', s))
# $: 结尾
print(re.findall('死了$', s))
# []: 匹配中间的字符,只要单个字符
s = 'acefghjkacefsdfsdf'
print(re.findall('[acef]', s)) # 只要单个字符
# []+^联用: ^对[]内的元素取反
print(re.findall('[^acef]', s))
# .: 任意字符(除了
)
s = 'abacadaeaf'
print(re.findall('a..', s))
['王大炮']
['死了']
['a', 'c', 'e', 'f', 'a', 'c', 'e', 'f', 'f', 'f']
['g', 'h', 'j', 'k', 's', 'd', 's', 'd']
['aba', 'ada']
s = 'abaacaaaaa'
# *: 前面的字符0-无穷个
print(re.findall('a*', s))
# +: 前面的字符1-无穷个
print(re.findall('a+', s))
# ?: 前面的字符0-1个
print(re.findall('a?', s))
# {m}: 前面的字符m个
print(re.findall('a{5}', s))
# {n,m}: 前面的字符2-3个 # 'abaacaaaaa'
# a aa aaa aa
print(re.findall('a{2,5}', s))
['a', '', 'aa', '', 'aaaaa', '']
['a', 'aa', 'aaaaa']
['a', '', 'a', 'a', '', 'a', 'a', 'a', 'a', 'a', '']
['aaaaa']
['aa', 'aaaaa']
# d: 数字
s = 's 1 s+
=$ 2_s 3'
print(re.findall('d', s))
# D: 非数字
print(re.findall('D', s))
# w: 数字/字母/下划线
print(re.findall('w', s))
# W: 非数字/字母/下划线
print(re.findall('W', s))
# s: 空格/ /
print(re.findall('s', s))
# S: 非空格/ /
print(re.findall('S', s))
```
['1', '2', '3']
['s', ' ', ' ', ' ', ' ', ' ', 's', '+', '
', '=', '$', ' ', '_', 's', ' ', ' ']
['s', '1', 's', '2', '_', 's', '3']
[' ', ' ', ' ', ' ', ' ', '+', '
', '=', '$', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ', '
', ' ', ' ', ' ']
['s', '1', 's', '+', '=', '$', '2', '_', 's', '3']
```
# : 取消意义
s = 'abad'
print(re.findall(r'a\d', s))
# .*: 贪婪模式(最大化),找到继续找,让结果最大化
s = 'abbbcabc'
print(re.findall('a.*c', s))
# .*?: 非贪婪模式(最小化),找到就马上停止
print(re.findall('a.*?c', s))
# (): 只要括号内的
s = 'abacad'
print(re.findall('a(.)', s))
# A|B: A和B都要
s = 'abacad'
print(re.findall('a|b', s))
['ad']
['abbbcabc']
['abbbc', 'abc']
['b', 'c', 'd']
['a', 'b', 'a', 'a']
re模块的方法
re.compile
修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 w, W, , B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
import re
s = 'abc123
def456'
# print(re.findall('d+',s))
# com = re.compile('d+')
par = 'd+'
# com = re.compile('3.',re.S)
# print(re.findall(com, s))
print(re.findall('3.', s, re.S))
s = '123abc123
def456'
print(re.findall('d+', s))
['3
']
['123', '123', '456']
import re
s = '123abc123
def456'
# re.mathch(): 从开头搜索,搜索到了就有,没搜索到就是none
res = re.match('d+', s)
print(res)
print(res.group())
# re.search(): 搜索第一个匹配结果,找到了就不找了
res = re.search('d+', s)
print(res)
print(res.group())
<_sre.SRE_Match object; span=(0, 3), match='123'>
123
<_sre.SRE_Match object; span=(0, 3), match='123'>
123
# re.split(): 按照匹配规则切割
import re
s1 = 'abc324asdfk234lkjsf324lkj'
print(re.split('d+', s1))
# re.sub(): 按照匹配规则替换(**********)
print(re.sub('d+', '***', s1))
# re.subn(): 按照匹配规则替换,并计数
print(re.subn('d+', '***', s1))
# 分组: 一个括号里的叫一个分组, django, 了解
s = 'abc123edf456'
res = re.search('abc(?P<abc>d+)edf(?P<edf>d+)', s)
print(res.groupdict())
['abc', 'asdfk', 'lkjsf', 'lkj']
abc***asdfk***lkjsf***lkj
('abc***asdfk***lkjsf***lkj', 3)
{'abc': '123', 'edf': '456'}