Python正则表达式
Re简介
正则表达式(Regular Expression,RE,以下简称Re)通常用来检索、替换那些符合某个模式(规则)的文本,也就是说,RE是用来记录文本规则的代码。
总的来说,正则表达式是:
- 通用的字符串表达框架
- 简洁表达一组字符串的表达式
- 针对字符串表达“简洁”和“特征”思想的工具
- 判断字符串的特征归属
Re的使用
编程语言使用正则表达式时需要编译,将符合正则表达式语法的字符串转换成正则表达式特征,也就是说,编译是将一个符合正则表达式语法的字符串编译为正则表达式。
我们用字符串的形式表示正则表达式,如字符串
[a-z]
是表示匹配a到z中的任意一个字母的Re的表示方法
Re的语法
Re的语法是核心部分,RE语法是由字符和操作符组成。
常用操作符:
操作符 | 描述 | 具体用例 |
---|---|---|
. |
表示除换行符\n以外的任何单个字符,如果要匹配’.’,则使用\. ,其余字符同理 |
无 |
[] |
字符集,对单个字符给出取值范围 | 例:[abc] 表示a或b或c,[a-z] 表示从a到z的任意单个字符 |
[^] |
非字符集,对单个字符给出排除范围 | 例:[^abc] 表示非a或b或c的单个字符 |
* |
前一个字符0次或无限次扩展 | 例:abc* 表示ab、abc、abcc、abccc等 |
+ |
前一个字符1次或无限次扩展 | 例:abc+ 表示abc、abcc、abccc等 |
? |
前一个字符0次或1次扩展 | 例:abc? 表示ab、abc |
| | 左右表达式任意一个 | 例:abc|def表示abc或def |
\ |
将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 | 例: n 匹配字符 n。\n 匹配换行符,而 \\ 匹配 \ , \( 匹配 “(“。 |
{m} |
扩展前一个字符m次 | 例:ab{2}c 表示abbc |
{m,n} |
扩展前一个字符m到n(包括n)次 | 例:ab{1,2}c 表示abc、abbc |
^ |
匹配字符串开头 | 例:^abc 表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | 例:abc$表示abc且在一个字符串的结尾 |
() |
分组标记,内部只能用|操作符 | 例:(abc) 表示abc,(abc|def)表示abc或def |
\d |
表示数字,等价于[0-9] |
无 |
\w |
表示单词字符,等价于[A-Za-z0-9_] (包括下划线) |
无 |
Re语法实例
正则表达式 | 匹配的字符串 |
---|---|
P(Y|YT|YTH)?N | ‘PN’、’PYN’、’PYTN’、’PYTHN’ |
PYTHON+ |
‘PYTHON’、’PYTHONN’、’PYTHONNN’… |
PY[TH]ON |
‘PYTON’,’PYHON’ |
PY[^TH]?ON |
‘PYON’、’PYaON’、’PYbON’…(不含T和H即可) |
PY{0,3}N |
‘PN’、’PYN’、’PYYN’、’PYYYN’ |
^[A-Za-z]+$ |
由26个字母组成的字符串 |
^[A-Za-z0-9]+$ |
由26个字母和数字组成的字符串 |
^-?\d+$ |
整数形式的字符串 |
^[0-9]*[1-9][0-9]*$ |
正整数形式的字符串 |
[1-9]\d{5} |
中国境内邮政编码,6位 |
[\u4e00-\u9fa5] |
匹配中文字符(UTF-8编码) |
\d{3}-\d{8}|\d{4}-\d{7} | 国内电话号码,如000-12345678 |
如果想要匹配ip地址,需要考虑如何表示取值范围在0-255,将其分为四部分,即0-99,100-199,200-249,250-255:
(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])
上述正则表达式,每两个|
之间的正则表达式表示一个范围内的数,比如[1-9]?\d
表示0-99
Python的re库
python中的re库使用raw string(原生字符串类型)表示正则表达式,如原生字符串text
写作r'text'
例如,r'[1-9]\d{5}'
是用来匹配邮政编码的Re字符串形式
raw string 是指不包含转义符的字符串,即
\
不被认为是转义符
也可以使用string类型,但是更繁琐,不建议使用
主要功能函数
re.search()
# 在一个字符串中搜索匹配Re的第一个位置,返回match对象re.match()
# 从一个字符串的开始位置起匹配Re,返回match对象re.findall()
# 搜索字符串,以列表类型返回全部能匹配的字符串re.split()
# 将一个字符串按照Re匹配结果进行分割,返回列表类型re.finditer()
# 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象re.sub()
# 在一个字符串中替换所有匹配Re的子串,返回替换后的子串
函数的具体参数使用,详见官方文档,以re.search()
函数举例:
1 |
|
使用方法
函数式用法,一次性操作:
1
rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
面向对象用法,编译后的多次操作
1
2pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081')pat = re.compile(pattern, flags=0)
是编译函数,将Re的字符串形式编译为Re对象生成的结果pat才是正则表达式,参数pattern只是正则表达式的字符串表示方法
Match对象
match对象是re函数的一种返回值对象,其有很多属性。
属性:
代码 | 含义 |
---|---|
match.string |
待匹配的文本 |
match.re |
匹配时使用的正则表达式 |
match.pos |
正则表达式搜索文本的开始位置 |
match.endpos |
正则表达式搜索文本的结束位置 |
方法:
代码 | 含义 |
---|---|
match.group(0) |
返回匹配后的字符串 |
match.start() |
返回匹配字符串在原始字符串的开始位置 |
match.end() |
返回匹配字符串在原始字符串的结束位置 |
match.span() |
返回(start(),end()),即开始和结束位置 |
贪婪匹配和最小匹配
re库默认采用贪婪匹配,即输出匹配最长的子串
若想得到最小匹配,则需要对以下操作符扩展,即在引起贪婪匹配的操作符后加?
:
扩展 | 含义 |
---|---|
*? |
前一个字符0次或无限次扩展,最小匹配 |
+? |
前一个字符1次或无限次扩展,最小匹配 |
?? |
前一个字符0次或1次扩展,最小匹配 |
{m,n}? |
扩展前一个字符m至n次(含n),最小匹配 |
- 本文作者:Kangshitao
- 本文链接:http://kangshitao.github.io/2020/11/01/RegularExpression/index.html
- 版权声明:本博客所有文章均采用 BY-NC-SA 许可协议,转载请注明出处!