yandyand

导航

python中的re模块(正则表达式)

"""
re 模块 参数使用方法:
match() 从头匹配
search() 从整个文本搜索
findall() 找到所有符合的
split() 分割
sub() 替换
group() 结果转换为内容
groupdict() 结果转换为字段
"""
import re

#: . 匹配除\n之外的任意一个字符
#:匹配6次任意字符 . . . . . . == 6 所以结果解释 yang12 y a n g 1 2 == 6
# res = re.match('......','yang123123yang123123')
# print(res.group())

#: + 匹配前一个字符1次或多次
#: . 匹配任意字符 + 匹配前一个字符1次或者n次 所以 .+ 就是匹配所有字符
# res = re.match('.+','yang123yang123')
# print(res.group())


#: ^ 从开头匹配字符
#: ^ 匹配开头字符
# res = re.match('^yang','yang123yang123')
# print(res.group())


#: $ 匹配字符结尾
#: $ 匹配以3结尾的字符 . 是任意字符 $ 是结尾字符 ..3$ 就是匹配以3结尾的任意前2个字符
#:但是要注意一点这个时候需要使用全文检索了"search" 不能使用开头匹配"match"
# res = re.search('..3$','yan123ang123')
# print(res.group())


#:[] 限制
#:y 以 y 进行开头 [a-z] a-z的任意字符 + 匹配前面的字符1次或者n次 g 以 g结尾
#:注意这里也需要使用search全文检索
# res = re.search('y[a-z]+g',"yang123abc123yang")
# print(res.group())

#:匹配两个 # 号之间的
# res = re.search('#.+#','asda#hello#123901823')
# print(res.group())

#: ? 匹配?之前的一个字符出现或者不出现
#: ax? 匹配 a 或 x 出现 如果出现a or x 则返回出现的值
# res = re.search('ax?','abcd')
# print(res.group())
#####
#:ax? 匹配ax 其中a必出现x可以不出现
# res = re.search('ax?','acxbcd')
# print(res.group())
#####
#:a?nnc? 匹配a nnc 匹配出现a或者annc 其中nn是必现的
# res = re.search('a?nnc?','asdnnd')
# print(res.group())


# {x}{y} 匹配前字符出现y次
# [0-9] 匹配0-9之间的数字 {4} 代表的是出现次数 所以结果就是 匹配0-9之间的数字出现4次
# res = re.search('[0-9]{4}','asihduioas11231231jkashkdjas')
# print(res.group())

# | 或
#: a | b 匹配a或者b
# res = re.search('a|b','hkjhioioakjlk')
# print(res.group())

# () 分组匹配
#:匹配 abc{2} {2}为匹配前一个字符 c 两次 所以结果解释abcc
# res = re.search('abc{2}',"3asfabccasdoho")
# print(res.group())
#: (abc) 匹配abc {2} 匹配abc两次 (\|\|=) \ 转义| 所以 匹配 ||= 所以结果就是匹配 abc*2||= 结果就是 abcabc||=
# res = re.search('(abc){2}(\|\|=)',"857kjhabcabc||=32342")
# print(res.group())

'''
更多的参数:
\A 只从字符开头匹配
\Z 匹配字符结尾 含义$一样
\d 匹配数字0-9
\D 匹配非数字
\w 匹配[A-Za-z0-9] 也可认为是匹配所有数字和字母
\s 匹配空白字符 如 \t \n \r
'''

#:匹配名字 年龄 职业 其中?P<name> 代表将过滤出的内容结合 groupdit() 以字典的形式打印出来
#:结果就是{'name': 'yangyang', 'age': '21', 'job': 'student'}
# a = 'yangyang21student'
# b = re.search("(?P<name>[a-z]+)(?P<age>[0-9]+)(?P<job>\w+)",a).groupdict()
# print(b)

#:识别身份证号
# id = '412725199802261711'
# b = re.search('(?P<市区>\d{3})(?P<省份>\d{3})(?P<出生年>\d{4})(?P<出生日期>\d{4})(?P<本人编号>\d{4})',id).groupdict()
# print(b)

#:split() 分割
#:[0-9] 按照数字进行分割 + 拿出重复多次
# res = re.split('[0-9]+','abc127389asdjl091390asjd91023890')
# print(res)


#:sub() 替换 附加参数count count如果不加的话默认是替换所有
#:a+ 匹配a 'or' 替换为or 最终结果oryyor123
# res = re.sub('a+','or',"ayya123")
# print(res)

#:匹配 \
#:这里注意一点 当我使用正则想匹配 \ 时 正常的情况下得这么写 \\ 才可以匹配反斜杠 但如果我想要过滤的\特别多怎么办 总不能写很多的\\把所以引出了
#: r 这个参数 r'\\s' 代表匹配\s 这样写更加的方便直观
# res = re.search(r'\\s','yang\sax')
# print(res.group())

#:flags
#:flags=re.I
#:忽略大小写匹配 [a-z]+ 匹配a-z多次 flags=re.I 忽略大小写匹配
# res = re.search('[a-z]+','asAdf\dx',flags=re.I)
# print(res.group())

#:多行匹配 匹配多行
#:字符串'\ngqwqw\ndxas\nadf\nasdf'中有很多\n 加了flags=re.M 后是多行都进行匹配
# res = re.search('^g','\ngqwqw\ndxas\nadf\nasdf',flags=re.M)
# print(res.group())

#:匹配任意字符
# res = re.search('g', 'g\ngqwqw\ndxas\nadf\nasdf', flags=re.S)
# print(res.group())

posted on 2020-09-06 02:39  yandyand  阅读(259)  评论(0编辑  收藏  举报