python基础day21 正则表达式和re模块

发布时间 2023-06-08 15:00:55作者: 追逐的小白

 

正则表达式的介绍

他是一门独立的语言,跟python等的语言没有任何的关系,但是其他语言可以使用正则表达式来做一些功能,主要是用来筛选数据的

^(13|14|15|18)[0-9]{9}$

形如上述代码的就是正则表达式

什么是正则表达式:

  利用一些特殊符号匹配出想要的数据就是正则表达式,简称正则

字符组

[0123456789] # 匹配0-9之间的数字
[0-9]        # 匹配0-9之间的数字
\d            # 匹配0-9之间的数字
[a-z]        # 匹配a-z之间的字符
[A-Z]        # 匹配A-Z之间的字符

# 匹配0-9a-zA-Z如何写
[0123456789ABCDEFGHIJ...abcdefghij...]
[0-9A-Za-z]

字符

.     匹配除换行符以外的任意字符     # 掌握
\w    匹配字母或数字或下划线            # 掌握
\s    匹配任意的空白符
\d    匹配数字                    # 掌握
\n    匹配一个换行符                    # 掌握
\t    匹配一个制表符
\b    匹配一个单词的结尾
^    匹配字符串的开始            # 掌握
$    匹配字符串的结尾            # 掌握
\W    匹配非字母或数字或下划线
\D    匹配非数字
\S    匹配非空白符
a|b    匹配字符a或字符b                # 掌握
()    匹配括号内的表达式,也表示一个组    
[...]    匹配字符组中的字符            # 掌握
[^...]    匹配除了字符组中字符的所有字符    # 掌握

量词

1. 量词只能影响前面的一个字符
2. 量词不能单独使用,必须配合其他字符串使用
*    重复零次或更多次
+    重复一次或更多次
?    重复零次或一次
{n}    重复n次
{n,}    重复n次或更多次
{n,m}    重复n到m次

贪婪匹配和非贪婪匹配

# 待匹配的字符
<script>123</script>

# 正则表达式是:
<.*>

# 匹配结果是:
<script>
<script>123</script>

# 默认匹配的是贪婪匹配:尽可能的多匹配
'''把贪婪匹配转为非贪婪匹配'''
<.*?> # 非贪婪匹配尽可能的少匹配

.*?组合的用法

小练习

^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

# 由于正则表达式的复杂性,所以,以后遇到常见的匹配规则,我们就去百度搜
1. 写一个匹配常见的手机号的正则
^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$

转义字符

'\\\\\\\\n'
\\\\\\\\\\\\\\\\n
'\t'
\\t
'''一个斜杠只能转义一个字符'''


# 在python中转义字符推荐使用:r'\n' '\\n'  =====》 

re模块

1. re是内置的模块,可以直接使用
2. 在python中,要想使用正则需要借助于re模块
re: regular express
import re

# re.findall('这是正则表达式', '待匹配的文件')

# res=re.findall('b', 'eva jason kavin')
# print(res)  # ['a', 'a', 'a']
# 如果匹配不到字符,就返回空列表[]

# res=re.search('b', 'eva jason kavin')
# print(res)
# print(res.group())

"""如果匹配不到,就返回None"""
# if res:
#     print(res.group())
# else:
#     print('没有匹配到')

# try:
#     print(res.group())
# except Exception:
#     print('没有找到')


res=re.match('a', 'aeva jason kavin')  # 从开头开始匹配
print(res)
print(res.group())

分组

# 分组相关

# res = re.search('^[1-9](\d{14})(\d{2}[0-9x]?)$','110105199812067023')
# print(res)
# print(res.group())
# print(res.group(1))
# print(res.group(2))

# 无名分组

# 对于findall,它具有分组优先展示, 也称之为是无名分组
# res = re.findall('^[1-9]\d{14}(?:\d{2}[0-9x]?)$','110105199812067023')
# print(res)  # ['023']


# 有名分组

res = re.search('^[1-9]\d{14}(?P<month>\d{2}[0-9x]?)$','110105199812067023')
print(res)
# print(res.group(1))
print(res.group())
print(res.group(1))
print(res.group('month'))