一、正则表达式
正则表达式(Regular Expession 简称re),又称规则表达式
使用字符组合成规则来描述、匹配一系列符合条件的字符串
用途:
a. 用来文本搜索和替换
b. 查询指定数据
c. 分割比较复杂的字符串(爬虫获取图片、音频等内容)
函数 含义 re.compile(pattern,flags=0) 编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。 re.match(pattern, string[, flags=0]) 匹配 re.findall(pattern,string,flags=0) 匹配所有的字符串 import re dir(re) 查看正则模块包含属性和方法
二、正则语法
1. [] #代表原子表,存储表达式、字符集合。匹配所包含任意一个字符 [a] #匹配一个字母a,总是从字符串开头开始匹配 pattern = re.compile("[a][a]") result = pattern.match("aabaa") print(result) [abc] #匹配任意一个字母a/b/c,哪个字母在开头,先匹配谁 pattern = re.compile("[abc]") result = pattern.match("abcbaa") [a-z] #匹配任意一个小写字母 [\u4e00-\u9fa5] #匹配汉字 pattern = re.compile("[\u4e00-\u9fa5]") result = pattern.match("帅哥") [AbCd] #匹配任意一个大小写字母 [a-zA-Z] #匹配任意一个字母 [a-zA-Z0-9] #匹配任意一个数字和字母 2. ^ # 在原子表外,以什么为开头;在原子表内,除了什么之外 ^a[a-zA-Z0-9] # 匹配以a开头的双位数 pattern = re.compile("^a[a-zA-Z0-9]") result = pattern.match("aaa") [^a-zA-Z0-9] # 除了这些字母以外 pattern = re.compile("[^a-zA-Z0-9]") result = pattern.match("#aa") 3. $ # 以什么为结尾 ^和$搭配来使用,这样才能限制你匹配的内容和长度 "^1[3-8][0-9]{9}$" 匹配手机号 pattern = re.compile("^1[3-8][0-9]{9}$") result = pattern.match("13843844380") 4.{m} # 表示前边数量m个,不能单独使用 [a][a][a] == [a]{3} [a-zA-Z]{3} #匹配任意三个字母 ^[a-zA-Z]{3} #开头匹配任意三个字母 ^[a-zA-Z]{3}[0-9]{8}$ pattern = re.compile("^[a-zA-Z]{3}[0-9]{8}$") result = pattern.match("abc99998888") 5.{m,n} # 表示数量从m到n个,不能单独使用 pattern = re.compile("^[1-9][0-9]{4,10}") result = pattern.match("13599") 6.{m,} # 至少多少个,也不可以单独使用 7. ? # 可有可无, 匹配前边表达式0次或者1次,属于非贪婪限定符 pattern = re.compile("^[1-9][0-9]?") result = pattern.match("1") # 判断正负数 pattern = re.compile("[-+]?[0-9]") result = pattern.match("+5") 8. . # 匹配除了\n符以外的任意字符 不匹配\n pattern = re.compile(".") result = pattern.match("\n") 匹配 pattern = re.compile(".") result = pattern.match("a") 9. * # 匹配字符前边任意次{0,} pattern = re.compile("a*") result = pattern.match("a") 10. .* # 匹配除了换行符以外任意多次 贪婪匹配 pattern = re.compile(".*") result = pattern.match("kbbbbbbccccddkdkd") 11. .*? # 匹配除了换行符之外临近字符 非贪婪匹配 pattern = re.compile("a.*?a") result = pattern.match("alklkkjadsfhanlkjfhalkjfaa") 12. () (?:pattern) # 返回包含括号里的值 result = re.findall("Windows(?:95|98|NT|2000|7)","Windows98") (?=pattern) # 返回不包含括号里的值 result = re.findall("Windows(?=95|98|NT|2000|7|ME|XP)","WindowsMEWindowsXP") (?!pattern) # 只返回不包含内容 result = re.findall("Windows(?!95|98|NT|2000)","Windows1999Windows2000") 13. | # 表示或
三、特殊意义的字符
特殊字符 含义 \d [0-9] \D [^0-9] \w [a-zA-Z0-9_] \W [^a-zA-Z0-9_] \s 匹配空白字符 \S 匹配非空白字
四、普通字符
普通字符 1-9 a-zA-Z 元字符 ^ $ . * + ? = ! : | \ / () [] {} 由于它们是构造各种匹配复杂文本正则表达式的基本字符,所以被称为元字符
五、非打印字符
字符 描述 \n 换行符,等价于\x0c 和 \cL \r 匹配一个回车符\t\n 等价于\x0d和\cM \s 匹配任何空白字符,包括空格,制表符,换页符等等,等价于[\f\n\r\t\v] \S 匹配任何非空白字符,等价于[^\f\n\r\t\v] \t 匹配制表符,等价于\x09和\cl \v 匹配垂直制表符。等价于\x0b和\cK
六、练习
import re def isValidQQ(qq): pattern = re.compile("[1-9][0-9]{4,10}$") r = pattern.match(qq) if r: return True else: return False def isCheckQQ(qq): if qq.isdigit() == False: return "QQ{}号不全为数字".format(qq) if len(qq) < 5: return "QQ{}号长队不够".format(qq) if isValidQQ(qq) == True: return "QQ{}号合法".format(qq) else: return "QQ{}号不合法".format(qq) if __name__ == "__main__": while True: qq = input("请输入qq号:\n") if qq == "q": break print(isCheckQQ(qq))