正则表达式
2023-03-22 23:04:51 7 举报
AI智能生成
正则表达式
作者其他创作
大纲/内容
re模块
re.findall(regex, string)
查询所有的匹配项目,返回一个列表
str = 'abcd2023defgegg2022abd'
ret = re.findall('\d+', str)
print(ret) # ['2023', '2022']
ret = re.findall('\d+', str)
print(ret) # ['2023', '2022']
re.search(regex, string)
查询匹配项,只要找到1次就停止,返回re.Match object对象,
通过re.group获取结果,
如果返回值为None,re.group抛出异常(AttributeError: 'NoneType' object has no attribute 'group')
通过re.group获取结果,
如果返回值为None,re.group抛出异常(AttributeError: 'NoneType' object has no attribute 'group')
ret2 = re.search('\d+1', str)
print(ret2)
# <re.Match object; span=(4, 8), match='2023'> 得到一个对象, 如果未匹配到返回None
print(ret2.group()) # 2023 如果未匹配到,group会抛出异常
# 优化写法
if ret2:
print(ret2.group())
print(ret2)
# <re.Match object; span=(4, 8), match='2023'> 得到一个对象, 如果未匹配到返回None
print(ret2.group()) # 2023 如果未匹配到,group会抛出异常
# 优化写法
if ret2:
print(ret2.group())
正则规则
所有的规则中的字符就可以刚好匹配到字符串中的内容
元字符
定义:在正则表达式中能够帮助我们表示匹配内容的符号都是正则中的元字符
字符组: []
描述的是一个位置上能出现的所有可能性
一个中括号只表示一个字符位置
[abc]
匹配a或者b或者c
根据ascii码进行范围比对
[0-9]: 匹配0~9之间的任意一位数字字符
[a-z]: 匹配a~z之间的任意一位字符
[A-Z]: 匹配A~Z之间的任意一位字符
[0-9a-zA-Z]: 匹配0~9, a~z, A~Z之间的任意一位字符
[1-9][0-9]: 匹配1~9之间任意数字开头的2位数字
\d
匹配任意一位数字
digit
[0-9]
\w
匹配任意一位数字、字母、下划线
word
[0-9a-zA-Z_]
\s
匹配所有空格
空格|tab| enter
空格: 用空格匹配
\t: 匹配 tab键
\n: 匹配enger键
\W
非数字字母下划线
\D
非数字
\S
非空白
[\d\D]
匹配所有的数字和非数字 -》 匹配所有
[\w\W]
匹配所有的字母数字下划线和所有的非数字字母下划线 - 》 匹配所有
[\s\S]
匹配所有的空白和非控办 -> 匹配所有
.
匹配除了**换行符**之外的所有
非字符组: [^]
[^\d]: 匹配所有的非数字
[^1]: 匹配非数字1的字符
^
匹配一个字符串的开始
永远放在正则表达式的开头
$
匹配一个字符串的结尾
永远放在正则表达式的结尾
|
或
a表达式|b表达式:
匹配a表示或者b表达式的内容,如果匹配a成功了,不会继续和b匹配,所以如果两个表达式有重叠的部分,
总是把长的放在前边
总是把长的放在前边
()
分组
约束 | 描述的内容的范围问题
www\.(taobao|jd|tianmao)\.com
记忆元字符
都是表示能匹配哪些内容,一个元字符总是表示一个字符位置上的内容
1
\d
\w
\s
\t
\n
\D
\W
\S
2
[]
[^]
.
3
^
$
4
|
()
量词
{n}
表示匹配n次
{n, }
表示匹配至少n次
{n, m}
表示至少匹配n次,至多m次
?
表示匹配0次或1次
{0, 1}
+
表示匹配1次或多次
{1, }
*
表示0次或多次
{0, }
匹配0次问题:
任意整数
\d+
任意小数
\d+\.\d+
任意整数或小数
(\d+\.\d+)|\d+
\d+(\.\d+)?
练习:
匹配手机号码
要求:1开头,中间第二位[3-9], 总共11位
1[3-9]\d{9}
判断用户输入的内容是否合法,
如果用户输入的对就能查看到结果,如果输入的不对就不能查到结果
如果用户输入的对就能查看到结果,如果输入的不对就不能查到结果
^1[3-9]\d{9}$
从一个大文件中找到所有符合规则的内容
1[3-9]\d{9}
贪婪匹配和非贪婪匹配
贪婪匹配
在量词范围允许的情况下,尽量多的匹配
回溯算法
贪心算法
.*x
表示匹配任意字符,任意多次数,遇到最后一个才停下来
非贪婪匹配(惰性匹配)
在量词后面加上?号,表示非贪婪匹配
.*?x
表示匹配任意字符,任意多次数,但是一旦遇到x就停下来
转义符
原本有特殊意义的字符,到了表达它本身意义的时候,需要转义
有一些有特殊意义的内容,放在字符组中,会取消它的特殊意义
[.]: 表示 .
[().*?]: 表示 ().*?,在字符组中会取消这些字符的特殊意义
[a\-c]: - 在字符组中表示范围,如果不希望它表示范围,需要转义,或者放在字符组的最前面
匹配身份证号
18/15位身份证号
15位:
第一位 1~9
总共15位
第一位 1~9
总共15位
^[1-9]\d{14}$
18位:
第一位 1~9
中间16位数字
最后一位 0-9/X
第一位 1~9
中间16位数字
最后一位 0-9/X
^[1-9]\d{16}(\d|X)$
^[1-9]\d{16}[\dX]$|^[1-9]\d{14}$
^([1-9]\d{16}[\dX]|[1-9]\d{14})$
^[1-9]\d{14}(\d{2}[\dX])?$
https://tool.chinaz.com/regex/
0 条评论
下一页