正则表达式(一)
一、概述
-
定义
正则表达式是一种文字匹配模式,其本质是由一系列字符和特殊符号构成的,这个字串即正则表达式。
-
原理
通过普通字符和特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等。来表达某类特定的字符串,进而匹配。
-
应用
目前在自动化、接口测试中,如Jmeter进行接口关联操作时,往往会运用正则表达式进行匹配。
本篇主要讲述正则表达式中的基础,也是最重要的元字符。
二、元字符的使用
1、匹配字符
匹配字符:
.
,[...]
,[^...]
,\d
,\D
,\w
,\W
,\s
,\S
- 普通字符
匹配规则:每个普通字符匹配其对应的字符
>>> re.findall('abc','abcdefgabc')
['abc','abc']
普通字符和我们在word中找一个文字是一样的,想找’abc’就直接输入’abc’。汉字也是可以直接匹配的。
re
模块是python独有的匹配字符串的模块。在下一篇会继续讲解。
- 匹配单个字符
元字符:.
匹配规则:匹配除换行外的任意一个字符
>>> re.findall('马.','马云,马三和马化腾')
['马云', '马三', '马化']
被匹配的字串是一个整体,根据要查找的马.
去匹配所有符合规则的字串。
- 匹配字符集
元字符:[字符集]
匹配规则:匹配字符集中的任意一个字符
表达形式:
[abc#!好] 表示 [] 中的任意一个字符
[0-9],[a-z],[A-Z] 表示区间内的任意一个字符
[_#?0-9a-z] 混合书写,一般区间表达写在后面
>>> re.findall('[aeiou]','How are you!')
['o', 'a', 'e', 'o', 'u']
- 匹配字符集反集
元字符:[^字符集]
匹配规则:匹配除了字符集以外的任意一个字符
>>> re.findall('[^1-5]','0123456789')
['0', '6', '7', '8', '9']
- 匹配任意(非)数字字符
元字符:\d
,\D
匹配规则:\d
匹配任意数字字符,\D
匹配任意非数字字符
>>> re.findall('\d{1,5}','Mysql:3306,Redis:6379')
['3306', '6379']
- 匹配任意(非)普通字符
元字符:\w
,\W
匹配规则:\w
匹配普通字符,\W
匹配非普通字符
说明:普通字符指数字,字母,下划线,汉字。
>>> re.findall('\w+','Mysql:3306,Redis:6379')
['Mysql', '3306', 'Redis', '6379']
- 匹配任意(非)空字符
元字符:\s
,\S
匹配规则:\s
匹配空字符,\S
匹配非空字符
说明:空字符指空格\r \n \t \v \f
字符
>>> re.findall('\S+','Hello World')
['Hello', 'World']
2、匹配重复
- 元字符:
*
匹配规则:匹配前面的字符出现0次或多次
>>> re.findall('12*','13,123,1223,12223')
['1', '12', '122', '1222']
- 元字符:
+
匹配规则:匹配前面的字符出现1次或多次
>>> re.findall('[A-Z][a-z]+','Hello Python')
['Hello', 'Python']
注意:第一个[A-Z]只匹配了H和P,[a-z]+匹配了后面的字母。
- 元字符:
?
匹配规则:匹配前面的字符出现0次或1次
>>> re.findall('-?[0-9]+','坐标:x:13,y:-6,z:20')
['13', '-6', '20']
- 元字符:
{n}
匹配规则:匹配前面的字符出现n次
>>> re.findall('1[0-9]{10}','Tom:13868686888')
['13868686888']
- 元字符:{m,n}
匹配规则:匹配前面的字符出现m-n次
>>> re.findall('1[0-9]{5,10}','lily:146245,tom:123457212,lucy:152724')
['146245', '123457212', '152724']
匹配数字1
开头,后面跟着5
到10
个数字的字串
3、匹配位置
- 元字符:
^
匹配规则:匹配目标字符串的开头位置
re.findall('^今天','今天星期几?今天星期一,明天星期二')
['今天']
注意:加^
和不加的区别。
- 元字符:
$
匹配规则:匹配目标字符串的结尾位置
>>> re.findall('星期二$','明天星期几?明天星期二')
['星期二']
规则技巧:
^
和$
一定是在正则表达式的开头和结尾处。如果两个同时出现,则中间的部分必须匹配整个目标字符串的全部内容
- 匹配(非)单词的边界位置
元字符:\b
,\B
匹配规则:\b
表示单词边界,\B
表示非单词边界
说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置
>>> re.findall(r'\bis\b','This is a test')
['is']
注意: 当元字符符号与Python字符串中转义字符冲突的情况则需要使用r将正则表达式字符串声明为原始字符串,如果不确定那些是Python字符串的转义字符,则可以在所有正则表达式前加r。
4、其他
- 或关系
元字符:|
匹配规则:匹配|两侧任意的正则表达式即可
>>> re.findall('com|cn',"www.baidu.com/www.google.com/www.qq.cn")
['com','com','cn']
- 转义
元字符:\
匹配规则:如果匹配的目标字符串中包含正则表达式特殊字符,则在表达式中元字符就想表示其本身含义时就需要进行 \ 处理。
特殊字符: . * + ? ^ $ [] () {} | \
- 操作方法:在正则表达式元字符前加
\
则元字符就是去其特殊含义,就表示字符本身,匹配特殊字符.
时使用\.
表示本身含义
>>> re.findall('-?\d+\.?\d*',"123,-123,1.23,-1.23")
['123', '-123', '1.23', '-1.23']
-?\d+\.?\d*
这里的.
就是表示本身含义,而非元字符了。
三、小结
本篇主要涉及了元字符的使用,也是正则表达式的基础。
序号 | 元字符 | 含义 |
---|---|---|
01 | . | 匹配单个字符 |
02 | [字符集] | 匹配字符集中的任意一个字符 |
03 | [^字符集] | 匹配除了字符集以外的任意一个字符 |
04 | \d ,\D | 匹配任意(非)数字字符 |
05 | \w ,\W | 匹配任意(非)普通字符 |
06 | \s ,\S | 匹配任意(非)空字符 |
07 | * | 匹配前面的字符出现0次或多次 |
08 | + | 匹配前面的字符出现1次或多次 |
09 | ? | 匹配前面的字符出现0次或1次 |
10 | {n} | 匹配前面的字符出现n次 |
11 | {m,n} | 匹配前面的字符出现m-n次 |
12 | ^ | 匹配目标字符串的开头位置 |
13 | $ | 匹配目标字符串的结尾位置 |
14 | \b ,\B | \b 表示单词边界,\B 表示非单词边界 |
下一篇,再来讲(非)贪婪模式,re模块的一些进阶用法。