正则表达式常用模式:
^           匹配字符串的开头
$           匹配字符串的末尾
.           匹配除换行符外的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[...]       用来表示需要匹配的一组字符,[amk]表示匹配'a','m'或'k'
[^...]      匹配除了[]中的字符,[^abc]表示匹配除了'a','b','c'之外的字符
re*         匹配0个或者多个的表达式
re+         匹配1个或者多个的表达式
re?         匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{n}       精确匹配 n 个前面表达式,例如:o{2}不能匹配"Bob"中的"o",但是能匹配"food"中的两个o
re{n,}      匹配n个前面表达式,例如:o{2,}不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o,"o{1,}"等价于"o+","o{0,}"则等价于"o*"
re{n, m}    匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b         匹配a或b
(re)        对正则表达式分组并记住匹配的文本
\w          匹配字母数字及下划线,等价于'[A-Za-z0-9_]'
\W          匹配非字母数字及下划线,等价于'[^A-Za-z0-9_]'
\s          匹配任意空白字符,等价于[ \f\n\r\t\v]
\S          匹配任意非空字符,等价于[^ \f\n\r\t\v]
\d          匹配任意数字,等价于[0-9]
\D          匹配任意非数字,等价于[^0-9]
\A          匹配字符串开始
\z          匹配字符串结束
\Z          匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\G          匹配最后匹配完成的位置
\b          匹配一个单词边界,也就是指单词和空格间的位置,例如:'er\b'可以匹配"never"中的'er',但不能匹配"verb"中的'er'
\B          匹配非单词边界

正则表达式修饰符 - 可选标志
re.I    使匹配对大小写不敏感
re.L    做本地化识别(locale-aware)匹配
re.M    多行匹配,影响 ^ 和 $
re.S    使 . 匹配包括换行在内的所有字符
re.U    根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X    该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
1 #!/usr/bin/env python3
 2 # -*- coding: utf-8 -*-
 3 
 4 import re
 5 
 6 p = re.compile("^[0-9]")    # compile 函数用于编译正则表达式,生成一个正则表达式(Pattern)对象
 7 
 8 m1 = p.match("135Abc")    # match 方法尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回none
 9 print(m1.group())
10 
11 m2 = re.search("\d+", "as54_95,wq3s@do sa48ds")    # earch 方法扫描整个字符串并返回第一个成功的匹配
12 print(m2.group())
13 
14 m3 = re.findall("[0-9]+", "s682das57dao128qo")    # findall 方法在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
15 print(m3)
16 
17 m4 = re.sub("[0-9]+", "|", "s682das57dao128qo")    # sub 方法找到匹配到的内容,并进行替换,返回替换后的值
18 print(m4)
19 
20 m5 = re.split("[0-9]", "alex1rain2jack3helen rachel8")    # split 方法将匹配到的格式当做分割点对字符串进行分割成列表
21 print(m5)
22 
23 # 将匹配进行分组
24 contactInfo = "Oldboy School, Beijing Changping Shahe: 010-3838438"
25 m6 = re.search(r'([\w ]+), ([\w ]+): (\S+)', contactInfo)
26 print("培训机构: %s\n地址: %s\n电话号码: %s" % (m6.group(1), m6.group(2), m6.group(3)))
27 m7 = re.search(r'(?P<name>[\w ]+), (?P<address>[\w ]+): (?P<phone>\S+)', contactInfo)
28 print("培训机构: %s\n地址: %s\n电话号码: %s" % (m7.group('name'), m7.group('address'), m7.group('phone')))
29 
30 # 匹配手机号
31 mobile = input("请输入您的手机号: ")
32 mob_str = r'^1[34578]\d{9}$'
33 mod1 = re.compile(mob_str)
34 if mod1.match(mobile):
35     print("您的手机号是:", mobile)
36 
37 # 匹配邮箱地址
38 email = "abwy awlasix@abc.com 1216 lanten_123@163.com 1856277225@qq.com dskww ssuyqq-al@ss.net xsq654 admin1.sa@iCloud.com"
39 re_str = r'([\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+)'
40 mod2 = re.compile(re_str)
41 items = mod2.findall(email)
42 for item in items:
43     print(item)
44 
45 # 匹配IP
46 ip = input("请输入IP: ")
47 # trueIp = re.search("(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])", ip)
48 trueIp = re.search("^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)
49 if trueIp:
50     print("你输入的IP是:", trueIp.group())
51 else:
52     print("输入的IP格式不正确。")