python re正则模块

  1. 举例
life is short, i love python
# 我要验证这个字符串最后一个单词是不是life
# 我想拿到这个字符串中第三个单词,
# 都可以通过正则实现,现在来学习python re模块的使用
  1. re模块使用
# 导入re模块
import re

# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)

# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()

# 第一个re模块函数,match:从字符串的第一个字符开始匹配
# 示例
import re

# result = re.match("life", "life is short, i love python")
result = re.match("is", "life is short, i love python")

print(result)

# re.match() 能够匹配出以xxx开头的字符串
  1. 匹配单个字符
    上面我们了解到通过re模块能够完成使用正则表达式来匹配字符串,接下来我们讲解正则表达式的单字符匹配
import re

"""
.   匹配任意一个字符(除了\n)
        '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;
        '\n' 换行,换到当前位置的下一行,而不会回到行首;
        那就是windows在写入文件的时候把一个\n转换成了\r\n,\r保持不变,记事本只认\r\n
[]    匹配[]中列举的一个字符
\d    匹配一个数字,即0-9
\D    匹配非数字
\s    匹配空白,即空格,tab键
\S    匹配非空白
\w    匹配单词字符,即a-z,A-Z,0-9,_
\W    匹配非单词字符
"""

ret = re.match(".", "M")
# ret = re.match(".|\n", "\n")
# ret = re.match(".", "\n", re.S) # 匹配\n的两种方法
# ret = re.match("[.\n]", "\n")
print(ret.group())

ret = re.match("t.o", "too")
print(ret.group())

ret = re.match("t.o", "two")
print(ret.group())

其他的不讲了

  1. 匹配多个字符
import re

"""
*  匹配一个字符出现0次或者无限次
+  匹配一个字符出现1次或者无限次
?  匹配一个字符出现1次或者0次
{m}       匹配一个字符出现m次
{m,n}  匹配一个字符出现m次到n次
"""

ret = re.match("A-Z*", "Aabcdef")
print(ret.group())
    
# 题目1:匹配一个字符串是不是163的邮箱地址,且@符号之前有4到20位,例如hello@163.com

ret1 = re.match("[a-zA-Z0-9]{4,20}@163.com", "fdfaffafa@163.com")
print(ret1.group())

# 注意点
# 1.{}不能有空格,2.\w可以匹配汉字  3..要转义  4.结尾的问题
ret1 = re.match("\w{4, 20}@163.com", "fdfaffafa@163.com")
print(ret1.group())  # 错误示范
  1. 匹配开头结尾
import re
"""
^  匹配字符串开头
$  匹配字符串结尾
"""
# 题目1:匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com
ret1 = re.match("\w{4,20}@163\.com$", "fdfaffafa@163.comfaf")
print(ret1.group())

# match就是从头开始匹配
  1. 匹配分组
"""
|  匹配左右任意一个表达式
(ab)   将括号中的字符作为一个分组
\num   引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name)  引用别名为name分组匹配到的字符串
"""

print("\\n")
# |    匹配左右任意一个表达式
ret = re.match("a|b", "a")
print(ret.group())

# (ab) 将括号中的字符作为一个分组
ret = re.match("\w{4,20}@(163|126|qq).com", "test@163.com")
    if ret:
           print(ret.group(1))
        
       # 如果打印group(1)可以得到分组的结果
       else:
        print("不是163、126、qq邮箱")  # 不是163、126、qq邮箱
           
  
# \num 引用分组num匹配到的字符串
ret = re.match("<[a-zA-Z]>\w</[a-zA-Z]*>", "<html>hh</htmlbalabala>")
print(ret.group())
# 不行
# 引用分组

ret = re.match(r"<([a-zA-Z])>\w</\1>", "<html>hh</html>