Python-正则表达式

发布于:2024-06-29 ⋅ 阅读:(44) ⋅ 点赞:(0)

目录

一、打开正则表达式

 二、正则表达式的使用

1、限定符

(1)x*:*表示它前面的字符y 可以有0个或多个;

 (2)x+:表示它前面的字符可以出现一次以上;(+只可以匹配多次)

(3)x{}:精确指定一个字符x出现了多少次;

(4)x{2,5}:指定字符出现次数的范围,x{2,} :字符x出现2次以上;

(5)x?:字符x出现0次或1次;

2、运算符

(1)(x|y):匹配字符x或y。(xy)|(ab):匹配 xy 或ab;

3、字符类

4、元字符

5、贪婪匹配和懒惰匹配

三、正则表达式实际应用-Python实现

1、re.finadll 用法

2、re.search 用法

3、.group 用法

4、re.finditer 用法

5、re.match 和 re.fullmatch 用法

6、re.sub 和 re.subn 用法

7、re.split 用法

8、re.compile 用法

9、正则表达式实际运用

(1)匹配手机号

(2)将字符串转成字典格式


一、打开正则表达式

1、快捷键 Ctrl+R,将替换功能调出来且图中红框的位置一定要点亮,才可以使用正则表达式;

 二、正则表达式的使用

1、限定符

(1)x*:*表示它前面的字符y 可以有0个或多个;

 (2)x+:表示它前面的字符可以出现一次以上;(+只可以匹配多次)

(3x{}:精确指定一个字符x出现了多少次;

(4)x{2,5}:指定字符出现次数的范围,x{2,} :字符x出现2次以上;

(5)x?:字符x出现0次或1次;

2、运算符

(1)(x|y):匹配字符x或y。(xy)|(ab):匹配 xy 或ab;

3、字符类

[abc]+:表示匹配的字符只能取自abc

[a-z]表示所有的小写字母

[a-zA-Z]表示所有的英文字母

[a-zA-Z0-9]表示所有的英文字母和数字

[^a-zA-Z0-9]表示匹配除了尖号后面列出的所有字符之外的符号

4、元字符

正则里面的元字符基本上是以反斜杠开头的;

5、贪婪匹配和懒惰匹配

<.+>:贪婪匹配任意字符,不包括换行符

<.+?>:懒惰匹配任意字符

三、正则表达式实际应用-Python实现

注:需要用到 re 模块

1、re.finadll 用法

re.findall('.+', 'abc\ndef\nghi\n')  # 第一个参数是正则表达式,第二个参数是需要匹配的字符串
运行结果:['abc', 'def', 'ghi']
print(re.findall('.+', 'abc\ndef\nghi\n',flags=re.DOTALL))  # flags=re.DOTALL表示匹配所有的字符
运行结果:['abc\ndef\nghi\n']

查阅官方资料:

1)浏览器搜索 Python re flags;

2)找到官网并点击;


2、re.search 用法

# 用法与findall一样,唯一不同的是返回值;它只会匹配符合规则的第一个值,且返回的是一个Match对象。如果匹配不到,则返回NOne;

print(re.search('\d{3,4}', 'Tel-028-7654321'))
print(re.search('[a-z]{4,5}', 'Tel-028-7654321'))

运行结果:

<re.Match object; span=(4, 7), match='028'>
None

3、.group 用法

res = re.search('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321')

print(res.group())
print(res.group(1))
print(res.group(2))

运行结果:

028-7654321
028
7654321

4、re.finditer 用法

功能:匹配所有符合规则的内容,并处理成迭代器返回;

res = re.finditer('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321 Tel-059-0123467')
print(res)
for m in res:
    print(m.group())
    # print(m.group(1))
    # print(m.group(2)) 

运行结果:

<callable_iterator object at 0x0000021E7D812E60>

(1)group无参数:
028-7654321
059-0123467

(2)group参数为1:

028
059

(3)group参数为2:

7654321
0123467


 补充:

# 迭代器,不依赖于索引的迭代取值方式

迭代就是重复,每一次的重复都是在上一次的基础上

 详细请读python-迭代器


5、re.match 和 re.fullmatch 用法

re.match与re.seach用法一样,也是只匹配符合规则的第一个值,并返回Match对象。

但它只能匹配字符串的开头,若匹配不到返回None;

re.fullmatch ,从头匹配到尾,也就是进行匹配整个字符串,若成功返回Match对象,否则返回None;

6、re.sub 和 re.subn 用法

re.sub功能:将匹配到的内容替换成其他内容;可以穿字符串,函数地址

(1)传字符串

res = re.finditer('(\d{3,4})-(\d{7,8})', 'Tel-028-7654321 Tel-059-0123467')
for m in res:
    print(m.group())
print(re.sub('(\d{3,4})-(\d{7,8})', '***', 'Tel-028-7654321 Tel-059-0123467'))y

运行结果:

028-7654321
059-0123467
Tel-*** Tel-***

(2)传内存地址 - sub功能每匹配到一个值,就会得到一个Match对象,然后调用我们传的函数,并把Match对象传给他。

脱敏后的电话号码---运于外卖上

def des(m):  # 这里是为了sub调用函数,传对象给函数,这里m接收Match对象
    print(f'group(1):',m.group(1))

    tel = m.group(2)
    print(f'group(2):',tel)
    return tel[:2] + '***' + tel[-2:]  # tel[:2]得到tel的前两位,tel[-2:]得到后两位


print(re.sub('(\d{3,4})-(\d{7,8})', des, 'Tel-028-7654321 Tel-059-0123467'))

运行结果:

group(1): 028
group(2): 7654321
group(1): 059
group(2): 0123467
Tel-76***21 Tel-01***67

re.subn功能与re.sub一样,多返回了一个替换的次数

上面的例子

def des(m):
    tel = m.group(2)
    return tel[:2] + '***' + tel[-2:]


print(re.subn('(\d{3,4})-(\d{7,8})', des, 'Tel-028-7654321 Tel-059-0123467'))

运行结果;

('Tel-76***21 Tel-01***67', 2)

7、re.split 用法

作用:把正则匹配到的内容作为分隔符进行拆分

s = 'xyg,- time,  !dog,  cat'
# 传统的拆分
print(f'传统拆分:', s.split(','))

print(re.split('\w', s))  # \w 匹配单词字符(包括字母、数字和下划线)
print(re.split('\W', s))  # \W 匹配非单词字符
print(re.split('\W+', s))  # \W+  加上+ 表示只匹配的字符只能取自W

运行结果:

传统拆分: ['xyg', '- time', '  !dog', '  cat']
['', '', '', ',- ', '', '', '', ',  !', '', '', ',  ', '', '', '']
['xyg', '', '', 'time', '', '', '', 'dog', '', '', 'cat']
['xyg', 'time', 'dog', 'cat']

8、re.compile 用法

功能:传给它一个正则表达式,它会返回一个正则表达式对象;主要用于一个正则表达式被多次使用时。

res = re.compile('.*')
print(res.findall('Tel-028-7654321 Tel-059-0123467'))

运行结果:

['Tel-028-7654321 Tel-059-0123467', '']

9、正则表达式实际运用

(1)匹配手机号

phone_num = '''
125163251489
15812569487
15536854456
15587452256
15520361197
ab153023697
141111111111
12348567954
136489651035
13845620147
163258953255551

'''

print(re.findall(r'\b(13[0-9]|14[5-9]|15[0-35-9])\d{8}\b', phone_num))
print(re.findall(r'\b(?:13[0-9]|14[5-9]|15[0-35-9])\d{8}\b', phone_num))


# 加r:防止转义

# \b 标注字符的边界
# \d 匹配数字字符
# x{y} x字符出现y次
# x{a,b} 指定字符出现次数的范围

# 在编程语言中使用正则,如果正则表达式中出现小括号,那编程语言会把小括号视作匹配边界;也就是说会把小括号里面的内容视为一个group
# 解决方法:在小括号内的最前面加上?:,这样可以申明这个小括号不是一个group

运行结果:

['158', '155', '155', '155', '138']
['15812569487', '15536854456', '15587452256', '15520361197', '13845620147']

(2)将字符串转成字典格式

思想:

第一组:group(1)

第二组:group(2)

s = '''
Host: movie.douban.com
Pragma: no-cache
Referer: https://cn.bing.com/
'''
dic = {}
res = re.finditer('(.*): (.*)', s)
# .*:*表示它前面字符.可以有0个或多个
# : 冒号后面加空格,会因为字符串s中,冒号后面有空格

for m in res:  # res写了两个小括号,就是两组小括号
    # print(m.group(1))
    # print(m.group(2))
    dic[m.group(1)] = m.group(2)  # 填充到字典中

print(dic)

运行结果:

{'Host': 'movie.douban.com', 'Pragma': 'no-cache', 'Referer': 'https://cn.bing.com/'}


网站公告

今日签到

点亮在社区的每一天
去签到