正则表达式 regular expression regex RE
正则表达式是用来简洁表达一组字符串的表达式,主要用在字符串匹配中
正则表达式功能强大,可谓’一行胜千言’
.正则表达式使用前需要进行编译,
就是将符合正则表达式语法的字符串编译成一个特征,用以检测其他字符串是否符合该特征
正则表达式由字符和操作符组成:
操作符
. 表示任何字符
[ ] 字符集,对单个字符给出取值范围
[^ ] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符
* 一个字符0次或多次扩展
+ 一个字符1次或多次扩展
? 前一个字符0次或1次扩展 abc?表示ab,abc
| 左右表达式任意一个 abc|def 表示abc,def
{n} 扩展前一个字符n次 ab{2} 表示abb
{m,n} 扩展前一个字符m到n次 ab{1,2} 表示ab,abb
^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头
$ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾
() 分组标记,内部只能用|操作符 (abc)表示abc,(abc|def)表示abc,def
\d 数字,等价于[0-9]
\w 单词字符,等价于[A-Za-z0-9_]
PY[^TH]?ON 'PYON' 'PYaON' 'PYcON'... 即匹配PY开头ON结尾中间没有或有一个字符但是不是T或H的字符串
PY{:3}N 把大括号前的字符扩展0到3次 ‘PN’ ‘PYN’ ‘PYYYN’
^[A-Za-z]+$ 由26个字母组成的字符串 其中^ $规定要匹配开头和结尾
^-?\d+$ 整数形式的字符串
^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
[1-9]\d{5} 中国境内邮政编码6位
正则表达式类型:
raw string 类型(原生字符串类型指不包含转义符的字符串)
例如r'[1-9]\d{5}' re库使用raw string类型表示正则表达式,表示为r'text'
string 类型(包含转义符,比较繁琐)
'[1-9]\\d{5}'
re库主要功能函数
re模块中的常用函数
1 search():
字符串查找是否存在匹配的内容,返回第一个匹配内容,没找到返回None
2 match():
从字符串开始位置起开始匹配,如果找到返回match对象,没找到返回None。如果存在但不是在起始位置也不算。
3 findall():
以列表类型返回所有match对象,如果失败返回None
4 finditer():
在字符串中匹配,如果成功返回match可迭代对象,并可以通过循环方式对每一个匹配对象进行相关操作,如果失败返回None
for m in re.finditer(r'[1-9]\d{5}','BIT100081 TSU100084'):
if m:
print(m.group(0))
100081
100084
5 split():
按照匹配的字符串进行分割
可添加参数maxsplit=n 表示最大将字符串分割成多少个,超过最大限制则一起输出。
6 sub():
替换匹配的子字符串,返回替换之后的字符串,可添加参数限制最多替换多少个
m = re.sub(r'[1-9]\d{5}',':zipcode','BIT100081 TSU100084')
print(m)
BIT:zipcode TSU:zipcode
re库的两种用法
rst = re.search(r'[1-9]\d{5}','BIT100081 TSU100084')#一次性使用
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT100081 TSU100084')#面向对象,多次使用
re库的贪婪匹配和最小匹配
当有多个子串符合匹配条件时默认输出匹配最长的子串
当有操作符匹配不同长度子串时都可以加一个问号表示最小匹配
rst = re.search(r'PY.*N','PYXNXXXN')
print(rst.group(0))
rst = re.search(r'PY.*?N','PYXXXNXXXN')
print(rst.group(0))
PYXNXXXN
PYXXXN