测开小练习:常用正则小练习(1)

文摘   科技   2024-08-22 10:02   北京  
关注我们,一起学习+涨薪不掉队!

文 | 三毛和荷西
软件如何高效交付?这里有答案!免费送书ing!

分享你的测试成长经历,吴老师免费送书 !

1.  同时匹配正数,负数,小数

>>> re.match(r'^(-)?(0|[1-9]\d*)(\.\d+)?$', '0').group()

'0'

>>> re.match(r'^(-)?(0|[1-9]\d*)(\.\d+)?$', '0.12').group()

'0.12'

>>> re.match(r'^(-)?(0|[1-9]\d*)(\.\d+)?$','10.12').group()

'10.12'

>>> re.match(r'^(-)?(0|[1-9]\d*)(\.\d+)?$','-10.12').group()

'-10.12'

解析:
① ^表示以什么开头;$表示以什么结尾;\d表示匹配数字;*表示匹配前一个/前一组字符0次或多次;?表示匹配前一个/前一组字符0次或1次;+表示匹配前一个/前一组字符1次或多次;()表示一组字符,ab*表示匹配一个a0个以上b,而(ab)*表示匹配0个以上的ab|表示或的关系,如a|b,匹配的是a或者b,不能同时匹配;[]指定一个字符集,可以使用连字符-表示范围,如[1-9]表示匹配19中的任意一个数字,也可以写为[123456789],,前面提到的a|b,可表示为[ab]
② (-)?表示0个或1-,用于表示正负数
③ 0|[1-9]\d*:0|[1-9]表示0或者非零数;\d*表示0个或多个数字,整个0|[1-9]\d*用于表示0或者非零的整数部分
④ (\.\d+)?:\.用了转义符,表示匹配小数点;\d+表示1个以上的数字;整个(\.\d+)?表示0个或者1个小数部分显示,为0时,表示只有前面的整数部分,为1时表示带有小数部分
⑤ ^(-)?(0|[1-9]\d*)(\.\d+)?$表示只能匹配正负整数或者小数

2.  匹配汉字

>>> re.match(r'^[\u4e00-\u9fa5]+$', '中国')

<re.Match object; span=(0, 2), match='中国'>

>>> re.match(r'^[\u4e00-\u9fa5]+$', '中国').group()

'中国'

>>> re.match(r'^[\u4e00-\u9fa5]+$', '魑魅魍魉').group()

'魑魅魍魉'

>>> print(re.match(r'^[\u4e00-\u9fa5]+$', '1中'))#因有数字,未匹配到

None

解析:
① [\u4e00-\u9fa5]+:[\u4e00-\u9fa5]表示匹配\u4e00\u9fa5之间的任一字符,+表示匹配一次或多次
② Unicode中文汉字编码范围
     16进制表示:\u4e00(对应汉字是"一")至\u9fa5(对应汉字是"龥")
     对应的十进制:19968至40869
③ ^[\u4e00-\u9fa5]+$表示只匹配一个或多个中文汉字

3.  匹配英文和数字

>>> re.match(r'^[A-Za-z0-9]+$', '0')

<re.Match object; span=(0, 1), match='0'>

>>> re.match(r'^[A-Za-z0-9]+$', '01')

<re.Match object; span=(0, 2), match='01'>

>>> re.match(r'^[A-Za-z0-9]+$', '0a')

<re.Match object; span=(0, 2), match='0a'>

>>> re.match(r'^[A-Za-z0-9]+$', '中')#因有中文,未匹配到

>>> re.match(r'^[A-Za-z0-9]+$', 'A1')

<re.Match object; span=(0, 2), match='A1'>

解析:
① [A-Za-z0-9]+:[A-Za-z0-9]表示匹配任意一个a-z之间的小写字母,或A-Z之间的大写字母,或0-9之间的数字,+表示匹配一次或多次,即匹配1次或多次[]中的任意一个字符
② ^[A-Za-z0-9]+$表示只能匹配大小写字母和数字

4.  匹配英文数字和下划线

>>> re.match(r'^[A-Za-z0-9_]+$', 'a9')

<re.Match object; span=(0, 2), match='a9'>

>>> re.match(r'^[A-Za-z0-9_]+$', 'A')

<re.Match object; span=(0, 1), match='A'>

>>> re.match(r'^[A-Za-z0-9_]+$', 'Az')

<re.Match object; span=(0, 2), match='Az'>

>>> re.match(r'^[A-Za-z0-9_]+$', 'Z0')

<re.Match object; span=(0, 2), match='Z0'>

>>> re.match(r'^[A-Za-z0-9_]+$', '_Z0!')    # 因有!,未匹配到

>>> re.match(r'^[A-Za-z0-9_]+$', '_a')

<re.Match object; span=(0, 2), match='_a'>

解析:
① [A-Za-z0-9_]:[A-Za-z0-9]表示匹配任意一个a-z之间的小写字母,或A-Z之间的大写字母,或0-9之间的数字,或下划线_+表示匹配一次或多次,即匹配1次或多次[]中的任意一个字符
② ^[A-Za-z0-9_]$表示只匹配字母数字和下划线

5.  匹配中文数字和下划线

>>> re.match(r'^[\u4e00-\u9fa5A-Za-z0-9_]+$','1a')

<re.Match object; span=(0, 2), match='1a'>

>>>re.match(r'^[\u4e00-\u9fa5A-Za-z0-9_]+$', 'A_')

<re.Match object; span=(0, 2), match='A_'>

>>> re.match(r'^[\u4e00-\u9fa5A-Za-z0-9_]+$','魑魅魍魉1')

<re.Match object; span=(0, 5), match='魑魅魍魉1'>

>>>re.match(r'^[\u4e00-\u9fa5A-Za-z0-9_]+$', '1a!')

>>> re.match(r'^\w+$', '魑魅魍魉1')

<re.Match object; span=(0, 5), match='魑魅魍魉1'>

>>> re.match(r'^\w+$', 'A_')

<re.Match object; span=(0, 2), match='A_'>

>>> re.match(r'^\w+$', '1a')

<re.Match object; span=(0, 2), match='1a'>

>>> re.match(r'^\w+$', '1a!')

>>> 


^[\u4e00-\u9fa5A-Za-z0-9_]+$^\w+$

解析:
① [\u4e00-\u9fa5A-Za-z0-9_]+:[\u4e00-\u9fa5A-Za-z0-9_]表示匹配任意一个中文,或a-z之间的小写字母,或A-Z之间的大写字母,或0-9之间的数字,或下划线_+表示匹配一次或多次,即匹配1次或多次[]中的任意一个字符
② python\w也表示一个中英文,或数字或下划线,即在此例中\w[\u4e00-\u9fa5A-Za-z0-9_]等价
③ ^[\u4e00-\u9fa5A-Za-z0-9_]+$表示只匹配中英文数字和下划线

6.  国内电话号码(0511-4405222021-87888822)

>>>re.match(r'^(0\d{2}-\d{8}|0\d{3}-\d{7})$', '010-12345678')

<re.Match object; span=(0, 12),match='010-12345678'>

>>>re.match(r'^(0\d{2}-\d{8}|0\d{3}-\d{7})$', '010-1234567')

 

>>> re.match(r'^(0\d{2}-\d{8}|0\d{3}-\d{7})$','0755-12345678')

>>>re.match(r'^(0\d{2}-\d{8}|0\d{3}-\d{7})$', '0755-1234567')

<re.Match object; span=(0, 12),match='0755-1234567'>

解析:
① 国内电话区号加电话共11位,区号都是以0开头的3位或者4位数字,然后用短横线连接数字,区号为3位,后面的电话位数为8为,区号位4位,后面的电话位数为7
② {}扩起来的,是两次,表示前一个字符需要多少位,如\d{2}表示为匹配两位的数字
③ 0\d{2}-\d{8}区号部分0\d{2}表示0后面接两位数字,用短横线-连接8位数字,对应021-87888822的情况
④ 0\d{3}-\d{7}区号部分0\d{3}表示0后面接三位数字,用短横线-连接7位数字,对应0511-4405222的情况
⑤ (0\d{2}-\d{8}|0\d{3}-\d{7})中间的|为或,表示匹配两种情况中的任一种
(未完待续)
刷算法题有用吗?

1
你是工程师吗?

工程师是技术干部的职务名称之一。请关注“技术”二字!否则,请问你和用户有何区别?

2
你是正在或打算从事测试开发吗?

测试开发,开发在后面,核心还是开发,要写代码,要写代码,要写代码!

3
你是为了面试涨薪吗?

通常,测试能获得好的待遇一般在大公司,没点难度随便进?没点技术门槛公司从哪挣钱?除非付费人傻!


4
所有语言都离不开算法,你认同吗?

C、C++、java、javascript、python、英语、中文,要想交流简介通畅且效率高,没点算法支撑如何实现?

Just do it!


免费领取三节测试开发试听课
链接:https://pan.baidu.com/s/1nKqINq42KWm-hupBoebBWw
提取码:k5fv

无论上课或自学,

你首先需要准备:

每天 2 小时+的学习时间

每天坚持写代码的习惯!

有投入才有产出,

10k+的涨幅需要 1 年以上的努力!

祝你成功!


光荣之路出品

测试大佬和小白的故事

2020年度测试现状报告

自动化测试的目标

手把手教你pytest测试框架

测开必备-flask网站开发

IOS真机移动端App+H5混合自动化测试实战

产品测试规范

内推:字节跳动 | 测试开发

招聘QQ群:203715128

光荣之路
关注光荣之路软件技术培训账号,即时收取测试开发技术的免费公开课信息,各大公司测试及开发招聘信息、最新的技术咨询、线下测试技术分享沙龙信息
 最新文章