一、re模块
1.1 正则表达式
由一系列特殊字符拼接而成的表达式/规则,用于从一个大字符串中匹配出符合一定规则的子字符串
1.2 常用匹配模式
1.3 re模块具体使用
import re
# \w 匹配字母数字下划线(汉字)
print(re.findall('\w', 'hello_你好 -123!')) # ['h', 'e', 'l', 'l', 'o', '_', '你', '好', '1', '2', '3']
# \W 匹配非字母数字下划线汉字之外的
print(re.findall('\W', 'hello_你好 -123!\n')) # [' ', '-', '!', '\n']
# \s 匹配空包字符,等同于使用[\t\n\r\f]
print(re.findall('\s', 'hello world!\n')) # [' ', '\n']
# \S 匹配非空字符
print(re.findall('\S', 'hello world!\n')) # ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '!']
# \D 匹配任意非数字字符
print(re.findall('\D', 'hello world123!')) # ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!']
# \d 匹配任意数字字符 等价于使用[0-9]
print(re.findall('\d', 'hello world123!')) # ['1', '2', '3']
# \n、\t
print(re.findall('[\t\n]', 'hello\tworld\n')) # ['\t', '\n']
# ^ 匹配以...开头的字符串
print(re.findall('^hel', 'hello world')) # ['hel']
# $ 匹配以...结尾的字符串
print(re.findall('ld$', 'hello world')) # ['ld']
# . 匹配任意字符(除了\n),可以指定re.DOTALL标识匹配\n
print(re.findall('.', 'abc!\n\t123', re.DOTALL)) # ['a', 'b', 'c', '!', '\n', '\t', '1', '2', '3']
print(re.findall('a.b', 'avb a b a!b a\tb a1b')) # ['avb', 'a b', 'a!b', 'a\tb', 'a1b']
# [] 匹配一个字符, 可以指定范围,如果字符包含"-"需要放到开头或者最后
print(re.findall('[-+*/]', 'a+b a-b a*b a/b')) # ['+', '-', '*', '/']
print(re.findall('[a-zA-Z]', 'Hello World')) # ['H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd']
# [^] 代表取反
print(re.findall('[^0-9]', 'hello 12345')) # ['h', 'e', 'l', 'l', 'o', ' ']
# *:左边的字符出现0次或者无穷次,等同于{0,}
print(re.findall('ab*', 'a ab abbbabbbbbbb')) # ['a', 'ab', 'abbb', 'abbbbbbb']
# +:左边的字符出现1次或者无穷次,等同于{1,}
print(re.findall('ab+', 'a ab abbbabbbbbbb')) # ['ab', 'abbb', 'abbbbbbb']
# {n,m}:左边的字符出现n~m次子字符串
print(re.findall('ab{2,4}', 'ab abb aaabbb abbbbb')) # ['abb', 'abbb', 'abbbb']
# ?:匹配左边的字符出现0或者1次的子字符串
print(re.findall('ab?', 'a ab abb abbb ')) # ['a', 'ab', 'ab', 'ab']
# 搭配使用.*:可匹配所有,贪婪匹配
print(re.findall('a.*b', 'ahellob a b ab a#\tb')) # ['ahellob a b ab a#\tb']
# .*? : 可以非贪婪匹配所有
print(re.findall('a.*?b', 'ahellob a b ab a#\tb')) # ['ahellob', 'a b', 'ab', 'a#\tb']
# ():分组,只返回括号内(组内)的部分
print(re.findall('(ab)+123', 'ababab123')) # ['ab']
# (?:):取消分组,返回匹配的全部内容
print(re.findall('(?:ab)+123', 'ababab123')) # ['ababab123']
# |:表示或者
print(re.findall('hobb(?:ies|y)', '-do you have any hobby?-i have many hobbies!')) # ['hobby', 'hobbies']
# \
print(re.findall('a\\c', 'a\c a1c aac')) # 对于正则来说a\\c确实可以匹配到a\c,但是在python解释器读取a\\c时,会发生转义,然后交给re去执行,所以抛出异常
print(re.findall('a\\\\c', 'a\c a1c aac')) # ['a\\c']
1.4 re模块的方法
(1)re.findall
返回所有满足匹配条件的结果,放在列表里
(2)re.search
只找到第一个匹配条件的然后就返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果没有匹配的就返回None
import re
print(re.search('o', 'hello world')) # <re.Match object; span=(4, 5), match='o'>
print(re.search("\d+\.?\d*", "1.3 aa3.44aaa").group()) # 1.3
print(re.search("\d+\.?\d*", "hello")) # None
(3)re.match
在字符串开头开始匹配,不满足条件返回None
可以使用re.search + ^ 来代替
import re
print(re.match("\d+\.?\d*", "1.3 aa3.44aaa").group()) # 1.3
print(re.match("\d+\.?\d*", "1.3 aa3.44aaa")) # <re.Match object; span=(0, 3), match='1.3'>
(4)re.split
可以指定多个自定义的分隔符,而字符串内置的split方法每次只能按照一种字符来分割
import re
msg = 'cc:18-male+handsome'
print(re.split('[:+-]', msg)) # ['cc', '18', 'male', 'handsome']