随笔 - 47  文章 - 14  评论 - 0  阅读 - 5243

正则使用方法

今日学习内容

  • 正则表达式介绍
  • 正则表达式基本使用
  • 正在表达式特殊符号
  • 正则表达式量词
  • 正则表达式贪婪与非贪婪
  • 正则表达式取消转义
  • python内置模块之re模块

内容详细

正则表达式介绍
在一般网站的注册界面获取手机号:
	有很多校验规则必须是11位的纯数字 并且必须是常规的手机号开头中国大陆的手机号[1315171819] 那么 问题来了 我们能否用python来实现手机的校验功能 我们来试一下
phone_num = input('num:').strip
if len(phone_num) == 11:
    if phone_num.isdingit():
        if phone_num.startwith('13') or if phone_num.startwith('15') or phone_num.startwith('17') or phone_num.startwith('18')
        	print('这是一个正常的手机号')
        else:
            print('手机号开头不合法')
    else:
        print('手机号必须是纯数字')
else:
    print('手机号必须是11位')
next 则表达式实现手机校验功能
import re 
phone_number = input('输入手机号>>>>:').strip()
if re.match('^(16|14|15|17|18)[0-9]{9}$',phone_num):
    print('注册成功')
else:
    print('不是合法手机号')

解释:
正则表达式上述一门独立的语言 专门用来匹配、校验、筛查所需的数据任何编程语言都可以使用 在python中如果想用就必须借助于内置模块re 就是借助特殊符号去筛查数据问题 当然 你用正则符号直接写出数据也没问题 能把问题解决就行了

正则表达式之字符组

可以在站长之家这里实验自己要写的正则表达式:
	在线测试站:http://tool.chinaz.com/regex/(不用谢我 我叫雷锋)
[0123456789]      匹配09之间的任意一个数字
[0-9]             匹配09之间的任意数字(简写)
[a-z]              匹配a-z之间任意一个小写字母
[A-Z]			   匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z]       匹配任意一个数字或者大小写字母(无序表达)

正则表达式之特殊符号

有些特殊符号也是默认匹配一个字符 
.			匹配除换行符以外的任意字符
\w			匹配数字、字母、下划线
\d			匹配任意数字
\t			匹配一个制表符(tab键)
^			匹配字符串的开始
	eg:^19并且这个9必须在开头
$			匹配字符串的结尾,常常与^连用
\w			匹配非数字、字母、下划线
\d			匹配非数字
a|b			匹配a或者b管道符就算是or(或)的意思
()			给正则表达式分组不影响正则匹配
[]			字符组的概念(里面所有数据都是or的关系)
[^]			上箭号出现在中括号里表示取反的意思

正则表达式之量词

量词使用必须紧跟在表达式后面 不能单独使用目的是未来增加匹配的字符数

量词为了多匹配所有经量使用贪婪匹配:
*				重复零次或者多次(默认多次:次数越多越好)
+				重复一次或者多次(默认多次)
?			   重复零次或者一次(默认一次,越多越好)
{n}				重复n次
{n,}			重复最少n次 或者是说上限n次
{n,m}			重复n到m次(越多越好)

上课老师讲的立体

表达式						文本
海.					海燕    # 取3条
					海娇
    				海东  #只取海字开头
^海.					3 条  取海开头的一共三个
						.表示尽量多取
海.$					.表示任意字符 $调取尾部海就一条
李.?					李杰和李莲英和李二棍子
 李.*       李杰和李莲英和李二棍子     			1条
  李.+       李杰和李莲英和李二棍子     			1条
  李.{1,2}   李杰和李莲英和李二棍子     			3条
  
  李[杰莲英二棍子]*  李杰和李莲英和李二棍子 		3条
  李[^和]*    李杰和李莲英和李二棍子   			 3条
  
  \d+			   456bdha3											2
复杂正则的编写
校验身份证
身份证号码是一个长度为1518个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
 ^[1-9][0-9]{14}
 ^[1-9][0-9]{16}[0-9x]
取消转义
\n				\n	 False
\\n				\n	 True
\\\\n			\\n	 True	
在python中还可以在字符串的前面加r取消转义 更加方便
贪婪匹配与非贪婪匹配
正则贪婪匹配
<.*>		<script>alert(123)<script>
1条			贪婪匹配
			前面作为开始后的<>作为结束条件
<.*?>		<script>alert(123)<script>
2条			非贪婪匹配
			以第一个大括号的出现作为结束标志
量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加?即可

re模块

在python中无法直接使用正则 需要借助于模块
1. 内置re模块
2. 第三方的其他模块
import re

res = re.findall('a', 'jason oscar aaa')  # findall(正则表达式,待匹配的文本)
print(res)  # ['a', 'a', 'a', 'a', 'a']  # 结果是所有符合条件的数据 并且组织成了列表

res1 = re.search('a', 'jason oscar aaa')  # search(正则表达式,待匹配的文本)
print(res1)  # 查找到一个符合条件的数据就结束  没有则返回None
print(res1.group())  # a  没有则无法调用group() 直接报错

res2 = re.match('j', 'jason oscar aaa')  # match(正则表达式,待匹配的文本)
print(res2)  # None  从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
print(res2.group())  # j  没有则无法调用group() 直接报错

res3 = re.finditer('a', 'jason oscar aaa')  # finditer(正则表达式,待匹配的文本)
print(res3)  # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3])  # ['a', 'a', 'a', 'a', 'a']

obj = re.compile('\d+')  # 提前写好后续需要经常使用的正则
print(re.findall(obj,'asjd21hj13123j'))  # 写一遍之后 直接反复调用即可
print(re.findall(obj,'234328748hgjghj'))  # 写一遍之后 直接反复调用即可
print(re.findall(obj,'jhjhjh423432423'))  # 写一遍之后 直接反复调用即可
posted on   等秋叶的七月  阅读(452)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2025年3月 >
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 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示