浅学正则

单字符匹配

匹配某个字符串:match()只能够匹配一个对象

1
2
3
4
5
6
7
8
9
10
# 格式:match(表达式, 匹配对象)
# 返回结果是object,使用group方法打印输出
text = 'python'
result1 = re.match('py', text)
result2 = re.match('pt', text)
result3 = re.match('yt', text)
print(result1.group())
print(result2.group()) # 匹配不到,会返回None
print(result3.group()) # 匹配不到,会返回None,match函数从起始位置开始匹配
# 如果有多个匹配,group(n)可以指定匹配第几个
  1. 点(.):匹配任意的某个字符(无法匹配换行符)

  2. \d:匹配任意的某个数字(数字以外的内容均不匹配)

  3. \D:除数字以外均可匹配(\D和\d互补)

  4. \s:匹配空白字符(\n、\t、\r、空格都表示空白字符)

  5. \w:匹配小写的a-z,大写的A-Z,数字和下划线

  6. \W:匹配除小写\w之外的所有字符(\w和\W互补)

  7. []:组合的方式,只要在中括号内的内容均可匹配(多个匹配内容是,取"或",只要匹配对象中含有一个内容就匹配)

多字符匹配

  1. 星号(*):匹配零个或多个字符
1
2
3
4
5
6
7
8
9
text1 = '123456789'
result1 = re.match('[\d]*', text)
# 不加*号,只匹配“1”;加上后,能全部匹配
# 指得是:匹配[\d]零次或多次
print(result1.group()) # 输出:123456789

text2 = '123-456-789'
result2 = re.match('[\d]*', text)
print(result2.group()) # 只匹配到:123
  1. 加号(+):匹配一个或多个字符(至少有一个)

  2. 问号(?):匹配零个或一个字符

  3. {m}:匹配指定个数m个

1
2
3
text = '12345-6789'
result = re.match('[\d]{3}}', text)
print(result.group()) # 匹配到:123
  1. {m,n}:匹配m到n个字符(默认匹配最多次(n次))

匹配规则的替代方案

  1. \d —> [0-9]

  2. \D —> [^0-9] 中括号里面加^表示取反,在外面表示其后跟着的字符作为开头

  3. \w —> [0-9a-zA-Z_]

  4. \W —> [^0-9a-zA-Z_]

  5. [\d\D]、[\w\W] —> 匹配所有的字符


特殊匹配

1
2
result1 = re.match('[.]+', text)  # 仅仅匹配字符".",没有其他含义,也可以加转义来匹配:"\."
result2 = re.match('.+', text) # 匹配所有字符一次或多次
  • 匹配手机号码

    • re.match(‘1[3-9][0-9]{9}’, text) 第一位固定为1;第二位范围:3-9;第三位范围:0-9,匹配九次
  • 验证邮箱

    • re.match(‘[0-9a-zA-Z]]+@[0-9a-z]+[.]com’, text)
  • 验证身份证号

    • re.match(‘[0-9]{17}[0-9xX]’, text) 最后一位有可能是大小写的字母x或者数字

特殊匹配进阶

1
2
3
4
text1 = 'pythonpy'
result1 = re.search('py', text)
print(result1.group()) # 输出:py
# 全局匹配,只匹配一次
  • ^:表示以其后的字符开头,不在中括号内

  • $:表示以其后的字符结尾

  • |:匹配多个表达式或者字符串

    • 第一种
    1
    2
    3
    text = "https://www.baidu.com"
    result = re.search('[http|https|ftp|file]+', text)
    print(result.group()) # 输出:https
    • 第二种
    1
    2
    3
    text = "https://www.baidu.com"
    result = re.search('(http|https|ftp|file)', text)
    print(result.group()) # 输出:http,因为只要匹配到就算;可以理解成有优先级的概念,所以先匹配到了http

贪婪模式与非贪婪模式

默认:贪婪模式

  • 贪婪模式:尽可能多的去匹配内容
  • 非贪婪模式:尽可能少的去匹配内容添加"?"

group函数

前面的内容都是在做”匹配”,并未执行”提取”

==可以在group(n)中指定序号,表明提取指定的内容(以空格定位:”\s”)==


正则表达式的常用函数

  • re.match():从左往右进行匹配 开头不满足即失败

  • re.search():在整个字符串中查找,返回第一个被找到的字符串 只返回第一个

  • re.findall():在整个字符串中查找所有满足条件的字符串 返回结果为列表,输出不需要group函数,可以直接print

  • re.sub():替换字符串匹配出来的字符串进行替换

    1
    re.sub('\s(\w+@[0-9a-z]+\.com)', 'wrong', text)
  • re.split():主要用来分隔字符串返回一个列表

    1
    2
    3
    text = 'I am xxxxx'
    re.split(' ', text) # 匹配字符串以空格分隔
    re.split('[^\w]', text)
  • re.compile():对正则表达式进行编译好处:可以添加注释,防止自己忘了正则的含义

image-20230829172013461

1
2
3
text = r'<a target="blank" href= "pos ition_detail.php?id=33824&amp; keywords=python&amp;tid=87&amp; id=2218">python开发工程师</a>'
resu1t = re.findall('<a.*?href="(.*?)".*?</a>', text, re.DOTALL)
# 前后的".*?"表示匹配内容,而括号中的表示提取内容