正则表达式
| match方法 | 只匹配字符串开头 |
| search方法 | 扫描整个字符串,找到第一个匹配 |
| findall方法 | 扫描整个字符串,找到所有的匹配 |
| finditer方法 | 扫描整个字符串,找到所有的匹配,并返回一个可迭代对象 |
match方法的使用
re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:
re.match(pattern,string,flags=0)
import re
result1 = re.match(r'H','Hello')
result2 = re.match(r'e','Hello')
print(result1.group(0)) # 'H' 匹配到的元素
print(result1.span()) # (0,1) 匹配到的元素所在位置
print(result2) # None
search方法的使用
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
示例:
import re
result1 = re.search(r'He','Hello')
result2 = re.search(r'lo','Hello')
print(result1.group(0)) # He
print(result1.span()) # (0,2)
print(result2.group(0)) # lo
print(result2.span()) # (3,5)
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
示例:
result1 = re.search(r'天气','今天天气不错哟')
result2 = re.match(r'天气','今天天气不错哟')
print(result1) # <re.Match object; span=(2, 4), match='天气'>
print(result2) # None
findall 方法的使用
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式:
re.findall(pattern,string,flags=0)
示例代码:
ret = re.findall(r'\d+','he23ll34')
print(ret) # ['23', '34']
ret = re.match(r'\d+','he23ll34')
print(ret) # None match只匹配开头,所以匹配到
ret = re.search(r'\d+','he23ll34')
print(ret) # <re.Match object; span=(2, 4), match='23'> search 只能匹配到一个数字
注意事项:
findall方法匹配时,如果匹配规则里有分组,则只匹配分组数据。
ret = re.findall(r'\w+@(qq|126|163)\.com','123@qq.com;aa@163.com;bb@126.com')
print(ret) # ['qq', '163', '126'] 只匹配到了分组里的内容
如果正则表达式里存在多个分组,则会把多个分组匹配成元组。
ret = re.findall(r'\w+@(qq|126|163)(\.com)','123@qq.com;aa@163.com;bb@126.com')
print(ret) #[('qq', '.com'), ('163', '.com'), ('126', '.com')]
如果想要让findall匹配所有的内容,而不仅仅只是匹配正则表达式里的分组,可以使用 ?:来将分组标记为非捕获分组。
ret = re.findall(r'\w+@(?:qq|126|163)\.com','123@qq.com;aa@163.com;bb@126.com')
print(ret) # ['123@qq.com', 'aa@163.com', 'bb@126.com']
finditer方法的使用
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
ret = re.finditer(r'\d+','he23ll34') # 得到的结果是一个可迭代对象
for x in ret: # 遍历 ret 取出里面的每一项匹配
print(x.group(), x.span()) # 匹配对象里的group保存了匹配
re.compile方法的使用
我们在使用正则表达式时,可以直接调用re 模块的 match,search,findall等方法,传入指定的正则表达式。同时,也可以调用re.compile方法,生成一个正则表达式对象,再调用这个正则表达式对象的相关方法实现匹配。
示例:
re.match(r'h','hello') # 可以使用re.match方法直接匹配
也可以调用re模块的compile方法,生成一个 Pattern 对象,再调用 Pattern 对象的 match方法
regex = re.compile(r'h')
regex.match('hello')
re.search(r'l','hello')
regex = re.compile(r'l')
regex.match('hello')
regex = re.compile(r'l')
regex.findall('hello')
regex = re.complie(r'l')
regex.finditer('hello')
正则表达式修饰符
| 修饰符 | 描述 |
| re.I | 使匹配对大小写不敏感 |
| re.M | 多行匹配,影响 ^ 和 $ |
| re.S | 使 . 匹配包括换行在内的所有字符 |
示例:
print(re.search(r'L','hello')) # None
print(re.search(r'L', 'hello', re.I)) # 不区分大小写<re.Match object; span=(2, 3), match='l'>
\w+$ 表示匹配以一个或者多个字母结尾
re.M 可以进行多行匹配,每个换行都认为是一个结尾
print(re.findall(r'\w+$','i am boy\n you are girl\n he is man',re.M)) # ['boy', 'girl', 'man']
不实用re.M修饰符,只会匹配到最后的 man
print(re.findall(r'\w+$','i am boy\n you are girl\n he is man')) # ['man']
print(re.search(r'.','\n')) # None . 匹配除了 \n 以外的所有字符
print(re.search(r'.','\n',re.S)) # '\n' 匹配到了 \n
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身,一个正则表达式模式中的字母和数字匹配同样的字符串。
re.search(r'H','Hello') # 这里的 H 表示的就是字母 H 自身,代表有特殊含义
多数字母和数字前加一个反斜杠时会拥有不同的含义。
ret = re.search(r'\d','he12ms90') # 这里的 \d 表示的是匹配数字
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
ret = re.search(r'.','hello') # 这里的 . 表示的是匹配任意字符
ret = re.search(r'\.','he.llo') # 这里的 \. 进行了转义,才表示标点符号自身。
反斜杠本身需要使用反斜杠转义。由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于\\t )匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素,如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
非打印字符
非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
特殊字符
所谓特殊字符,就是一些有特殊含义的字符。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:
定位符
定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。
正则表达式的定位符有:
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
正则表达式的限定符有:
示例:
re.search(r'\s','大家好 我是 代码') # 匹配所有的空字符
re.search(r'\S','大家') # 匹配所有的非空字符
re.search(r'\n','大家好\n我是代码') # 匹配换行
re.search(r'n$','hello python') # 匹配以 n 结尾
re.search(r'^h.+n$','hello python') # 匹配以 h 开头,中间出现一次或多次任意字符,并且以n结尾
re.search(r'^ha*','h') # 匹配以 h 开头,a出现0次或者一次
Copy
练习:
用户名匹配:由数字、大小写字母、下划线_和中横线-组成,长度为4到14位,并且不能以数字开头。
r'^\D[a-z0-9A-Z_\-]{3,13}', 'sH_8'
匹配邮箱
r'^([A-Za-z0-9_\-\.])+@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$
匹配手机号
r'^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$'
匹配身份证号。
r'^[1-9]\d{5}(18|19|20|)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$'
匹配URL地址
r'((ht|f)tps?):\/\/([\w\-]+(\.[\w\-]+)*\/)*[\w\-]+(\.[\w\-]+)*\/?(\?([\w\-\.,@?^=%&:\/~\+#]*)+)?'
匹配QQ号
r'^[1-9][0-9]{4,10}$'
匹配微信号
r'^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$'
匹配车牌号
r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$'