分享

学习python 正则表达式——与你同行!

 天穹的雄鹰 2021-04-22

正则表达式定义

  又称为规则表达式,是一个特殊的字符序列,利用事先定义好的一些特定字符以及它们的组合组成一个'规则’,检查一个字符串是否与这种规则匹配来实现对字符的检索、过滤、匹配、替换。正则表达式需要用到re模块,该模块不是独立的第三方库,不需要单独安装,但是使用时必须预先导入。re模块提供了正则表达式操作所需的所有功能。

https://blog.csdn.net/hanhanwanghaha宝藏女孩的成长日记 欢迎您的关注!
欢迎关注微信公众号:宝藏女孩的成长日记
让这个可爱的宝藏女孩在努力的道路上与你一起同行!
如有转载,请注明出处(如不注明,盗者必究)

元字符:在构建正则表达式时,有些特殊字符和自身并不匹配,而是用来表明应和一些特殊的东西匹配,或者会影响重复次数,这些特殊字符称为元字符。

注: re模块中的findall方法以列表的形式返回所有能匹配的子串,如果没有找到匹配的,则返回空列表。

常用的元字符。

1. .:表示除换行符以外的任意一个字符;\S: 表示除空白符以外的任意一个字符

import re s = 'Hello,i am a college student.My name is Wang Tiantian.h\nb' print(s) print(re.findall(r'a',s)) #使用re.findall()方法返回所有能够匹配出的子串 print(re.findall(r'n..',s)) print(re.findall(r'm\S',s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:
在这里插入图片描述

2. []:指定字符集

(1)常用来指定一个字符集,如[abc],[a-z],[0-9];
(2)元字符在中括号中不起作用,如[akm\S]、[m.]中的元字符都不起作用;
(3)中括号内的'’表示补集,匹配不在区间范围内的字符,如[3]表示除3以外的任意字符。

import re
s = 'x5x2x0x13xx1x4xxyz'
print(re.findall(r'x[0-9]',s))
print(re.findall(r'x[0-9]x',s))
print(re.findall(r'x[0-9][0-9]x',s))
print(re.findall(r'x[^3]',s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行结果:

在这里插入图片描述

3. ^:匹配行首,匹配以^后面的字符开头的字符串

import re s = 'how world How are you How many students' print(re.findall(r'^h[o].',s))
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

运行结果:
在这里插入图片描述

4. $:匹配行尾,匹配以$之前的字符结束的字符串

import re
s = 'hello,I am wang! so I love you'
print(re.findall(r'you$',s))
print(re.findall(r'hello$',s))

b = 'sdma jdksmi djskjd masdmw'
# $在[]中作为普通字符
print(re.findall(r'm[aiw$]',b))
# 匹配ma,mi,mw结尾的字符串
print(re.findall(r'm[aiw]$',b))
# 匹配ma,mi,mw,m$结尾的字符串
print(re.findall(r'm[aiw$]$',b))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:
在这里插入图片描述

5. \:反斜杠后面可以加不同的字符以表示不同的特殊意义

(1)\b匹配单词头或单词尾;
(2)\B与\b相反,匹配非单词头或单词尾;
(3)\d匹配任何十进制数;相当于[0-9];
(4)\D与\d相反,匹配任何非数字字符,相当于[^0-9];
(5)\s匹配任何空白字符,相当于[\t\n\r\f\v];
(6)\S与\s相反,匹配任何非空白字符,相当于[^\t\n\r\f\v];
(7)\w匹配任何字母、数字或下画线字符,相当于[a-zA-Z0-9_];
(8)\W与\w相反,匹配任何非字母、数字和下画线字符,相当于[^a-zA-Z0-9_];
(9)也可以用于取消所有的元字符:\、[;
(10)这些特殊字符都可以包含在[]中。如:[\s,.]将匹配任何空白字符、',“或”.'。

import re s = '0x12x3x567x8x49y' print(re.findall(r'[0-9]',s)) print(re.findall(r'\d',s)) # 匹配字母x或者数字 print(re.findall(r'x\d',s)) print(re.findall(r'[x\d]',s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

在这里插入图片描述

6. *:匹配位于*之前的字符或子模式的0次或多次出现

import re
s = 'a ab abb abbbbb abbbbbxa'
re.findall(r'ab*',s) 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

运行结果:
在这里插入图片描述

7. +:匹配位于+之前的字符或子模式的1次或多次出现

import re s = 'a ab abb abbbbb abbbbbxa' print(re.findall(r'ab*',s)) print(re.findall(r'ab+',s))
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

运行结果:
在这里插入图片描述

8. :匹配位于?之前的0个或1个字符

当“?”紧随其他限定符(*、+、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。

import re
s = 'a ab abb abbbbb abbbbbxa'
print(re.findall(r'ab+',s))     #+符号后没有问号:默认的贪心模式(尽可能长)
print(re.findall(r'ab+?',s))    #+符号跟问号:非贪心模式(尽可能短)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

运行结果:
在这里插入图片描述

9.{m,n}:表示至少有m个重复,至多有n个重复。m和n均为十进制数。

忽略m表示0个重复,忽略n表示无穷多个重复。
{0,}等同于*;{1,}等同于'+';{0,1}与'?'相同,但是最好使用后者。

import re s = 'a b baaaabaacccaa ' print(re.findall(r'a{1,3}',s)) print(re.findall(r'a+',s)) print(re.findall(r'a{1,}',s)) print(re.findall(r'a{,3}',s)) print(re.findall(r'a{3}',s)) s = '021 - 33507yyz,021 - 33507865,010 - 12345678,021 - 123456789' print(re.findall(r'021 - \d{8}',s)) # \b匹配字符串的头和尾 print(re.findall(r'\b021 - \d{8}\b',s))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

运行结果:

在这里插入图片描述

例题

例一

随机产生10个长度为1-25之间,由字母、数字、下划线、'.’、'#’、'%’特殊字符组成的字符串构成列表,
找出列表中符合下列要求的字符串:长度为5~20,必须以字母开头,可带数字、下划线、'.’。

import string
import random
import re
List1 = []
 #生成包含大小写字母、数字和其他指定字符的字符串
x = string.ascii_letters+string.digits+'_.#%'
#生成列表List1
for i in range(10):
    #生成字符作为元素,个数为1~25随机数之间的字符列表y
    y = [random.choice(x) for i in range(random.randint(1,25))]
    #用join方法将y中的元素合并成字符串,并将其加入列表List1中
    List1.append(''.join(y))
#输出列表List1
print('生成的列表为:')
for s in List1:
    print(s)
print()

# 查找符合要求的字符串:
#(1)总长度为5~20
#(2)以字母开头(1个字符):^[a-zA-Z]{1}
#(3)可带数字、下划线、'.',至尾部共4~19个:[a-zA-Z0-9._]{4,19}$
#构建正则表达式
r = r'^[a-zA-Z]{1}[a-zA-Z0-9._]{4,19}$'
print('满足要求的字符串是:')
for i in List1:
    if re.findall(r,i):
        print(i)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行结果:
在这里插入图片描述

例二

编写程序,生成一个包含十个不重复的取自a~z(随机生成)的小写字母的列表,将原列表中'abcdefg’字母字符按位置顺序分别替换为'1234567’数字字符,即a替换为1,b替换为2,以此类推。先输出原列表和新列表,再采用字符串格式化方式逐个输出新列表中的元素。

# coding=utf-8 ''' 编写程序,生成一个包含十个不重复的取自a~z(随机生成)的小写字母的列表, 将原列表中'abcdefg’字母字符按位置顺序分别替换为'1234567’数字字符,即a替换为1,b替换为2, 以此类推。先输出原列表和新列表,再采用字符串格式化方式逐个输出新列表中的元素。 ''' import random list1 = [] i = 0 while i < 10: c = chr(random.randint(ord('a'), ord('z'))) if c not in list1: i += 1 list1.append(c) print('原列表:', list1) s1 = ','.join(list1) #通过maketrans和translate函数实现字符的替换 t = ''.maketrans('abcdefg', '1234567') s2 = s1.translate(t) list2 = s2.split(',') print('新列表', list2) print('逐个输出新列表中的元素:') for i in list2: print('%s' % i, end='')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

运行结果:
在这里插入图片描述

例三

生成15个包括10个字符的随机密码,密码中的字符只能是大小写字母、数字和特殊字符“@”、“$”、“#”、“&”、“_”、“~”构成。

# coding=utf-8

'''
生成15个包括10个字符的随机密码,
密码中的字符只能是大小写字母、
数字和特殊字符“@”、“$”、“#”、“&”、“_”、“~”构成。
'''

import string
import random

password1 = string.ascii_letters + string.digits + '@$#&_~'
for i in range(15):
    print('随机密码' + str(i + 1) + ':', end=' ')
    password2 = ''.join([random.choice(password1) for i in range(10)])
    print(password2, end=' ')
    print()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述

https://blog.csdn.net/hanhanwanghaha宝藏女孩的成长日记 欢迎您的关注!
欢迎关注微信公众号:宝藏女孩的成长日记
让这个可爱的宝藏女孩在努力的道路上与你一起同行!
如有转载,请注明出处(如不注明,盗者必究)

例四

# coding=utf-8 ''' 给定列表x=['13915556234', '13025621456', '15325645124', '15202362459'], 检查列表中的元素是否为移动手机号码,这里移动手机号码的规则是:手机号码共11位数字; 以13开头,后面跟456789中的某一个;或者以15开头,后面跟01289中的某一个。 ''' import re x = ['13915556234', '13025621456', '15325645124', '15202362459'] zz = r'^(13[4-9]\d{8})|(15[01289\d{8}])$' print('打印所有号码:', x) print('其中,为移动手机号码的为:') for i in x: if re.findall(zz, i): print(i)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果:
在这里插入图片描述
近日新感悟:如果遇到不是很确定是否要解决阻碍,那不妨退一万步,用最初的目标来衡量这件事是否值得。或者以客观的态度来衡量此事!

接下来这一年得好好努力了,希望明年的这个时候我已上岸!也祝所有考研的小伙伴一起努力,最后能够去到想去的大学!
在这里插入图片描述

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约