- 一、背景知识
- 1、什么是正则表达式
- 二、re简介
- 1、什么是re,为什么要使用re
- 2、re常用组件及功能
- 1)正则规则
- 1)正则表达式中常用的字符含义
- 2)预定义字符集(可以写在字符集[...]中)
- 2)re模块
- 1)正则规则
- 三、re模块
- 1)compile()
- 2)match()
- 3)search()
- 4)findall()
- 5)split()
- 6)其他方法
- 四、re 实战场景
- 1)正则实例
- 五、re常见问题
- 六、参考资料
一、背景知识
1、什么是正则表达式
正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序员们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。
二、re简介
1、什么是re,为什么要使用re
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。
推荐时间比较充裕的同学仔细阅读:https://deerchao.net/tutorials/regex/regex.htm#greedyandlazy 配合:https://regex101.com/ 食用更佳
2、re常用组件及功能
1)正则规则
1)正则表达式中常用的字符含义
普通字符 | 匹配自身 | abc | abc |
. | 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 | a.c | abc |
\ | 转义字符,使后一个字符改变原来的意思
| a\.c a\\c | a.c a\c |
* | 匹配前一个字符0或多次 | abc* | ab abccc |
+ | 匹配前一个字符1次或无限次 | abc+ | abc abccc |
? | 匹配一个字符0次或1次 | abc? | ab abc |
^ | 匹配字符串开头。在多行模式中匹配每一行的开头 | ^abc | abc |
$ | 匹配字符串末尾,在多行模式中匹配每一行的末尾 | abc$ | abc |
| | 或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式 | abc|def | abc def |
{ } | {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次 | ab{1,2}c | abc abbc |
[ ] | 字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。 所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。 | a[bcd]e | abe ace ade |
() | 被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号“(”,编号+1. 分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。 | (abc){2}a(123|456)c | abcabc a456c |
2)预定义字符集(可以写在字符集[...]中)
\d | 数字:[0-9] | a\bc | a1c |
\D | 非数字:[^\d] | a\Dc | abc |
\s | 匹配任何空白字符:[<空格>\t\r\n\f\v] | a\sc | a c |
\S | 非空白字符:[^\s] | a\Sc | abc |
\w | 匹配包括下划线在内的任何字字符:[A-Za-z0-9_] | a\wc | abc |
\W | 匹配非字母字符,即匹配特殊字符 | a\Wc | a c |
\A | 仅匹配字符串开头,同^ | \Aabc | abc |
\Z | 仅匹配字符串结尾,同$ | abc\Z | abc |
\b | 匹配\w和\W之间,即匹配单词边界匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 | \babc\b | 空格abc空格 |
\B | [^\b] | a\Bbc | abc |
2)re模块
- re.compile
- re.search
- re.match
- re.split
- re.findall
- 其他模块
三、re模块
1)compile()
说明:re.compile(pattern[, flags]) 编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
API和usage:https://docs.python.org/2/library/re.html#re.compile
- 简单例子:
import
re
tt
=
"Tina is a good girl, she is cool, clever, and so on..."
rr
=
re.
compile
(r
'\w*oo\w*'
)
print
(rr.findall(tt))
#查找所有包含'oo'的单词
|
2)match()
说明:re.match(pattern, string, flags=0) 决定RE是否在字符串刚开始的位置匹配。这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'
API和usage:https://docs.python.org/2/library/re.html#re.RegexObject.match
- 简单例子:
print
(re.match(
'com'
,
'comwww.runcomoob'
).group())
print
(re.match(
'com'
,
'Comwww.runcomoob'
,re.I).group())
|
3)search()
- 说明:re.search(pattern, string, flags=0) , re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
- 讲解:http://www.runoob.com/python/python-reg-expressions.html
- API和usage: https://docs.python.org/2/library/re.html#re.RegexObject.search
- 简单例子:
print
(re.search(
'\dcom'
,
'www.4comrunoob.5com'
).group())
#只返回第一个匹配
|
*注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
- group() 返回被 RE 匹配的字符串
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
- group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
a. group()返回re整体匹配的字符串,
b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
4)findall()
说明:re.findall(pattern, string, flags=0) re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
讲解:http://www.runoob.com/python/python-reg-expressions.html
https://www.zhihu.com/question/29764272/answer/45597454API和usage:https://docs.python.org/2/library/re.html#re.findall
- 简单例子:
p
=
re.
compile
(r
'\d+'
)
print
(p.findall(
'o1n2m3k4'
))
|
5)split()
- 说明:编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
- 格式:re.split(pattern, string[, maxsplit]) 按照能够匹配的子串将string分割后返回列表。可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。
- 讲解:http://www.runoob.com/python/python-reg-expressions.html
- API和usage:https://docs.python.org/2/library/re.html#re.split
- 简单例子:
print
(re.split(
'\d+'
,
'one1two2three3four4five5'
))
|
6)其他方法
其他方法可以参考:https://docs.python.org/2/library/re.html#module-re (官方文档)
四、re 实战场景
1)正则实例
- 具体见:https://thief.one/2017/10/30/1/
-
匹配IP地址的正则表达式 res
=
/
(\d
+
)\.(\d
+
)\.(\d
+
)\.(\d
+
)
/
g
匹配空行的正则表达式:res
=
\n[\s| ]
*
\r
匹配HTML标记的正则表达式:res
=
/
<(.
*
)>.
*
<\
/
\
1
>|<(.
*
) \
/
>
/
匹配首尾空格的正则表达式:res
=
(^\s
*
)|(\s
*
$)
匹配中文字符的正则表达式: res
=
[\u4e00
-
\u9fa5]
#python中需要转换为unicode
匹配双字节字符(包括汉字在内):res
=
[^\x00
-
\xff]
user_phone
=
r
"((?:13[0-9]|14[579]|15[0-3,5-9]|17[0135678]|18[0-9])\d{8})"
user_name
=
r"
"+u"
([\u4e00
-
\u9fa5\·]{
2
,
3
})"
user_id_18
=
r
"([1-9]\d{5}(?:1[9,8]\d{2}|20[0,1]\d)(?:0[1-9]|1[0-2])(?:0[1-9]|1[0-9]|2[0-9]|3[0,1])\d{3}[\dxX])"
user_id_15
=
r
"([1-9]\d{7}(?:0[1-9]|1[0-2])(?:0[1-9]|1[0-9]|2[0-9]|3[0,1])\d{2}[\dxX])"
car_id
=
r"
"+u"
([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]{
1
}[A
-
Z]{
1
}[A
-
Z0
-
9
]{
4
}[A
-
Z0
-
9
挂学警港澳]{
1
})"
email
=
r
"([a-z_0-9.-]{2,64}@[a-z0-9-]{2,200}\.[a-z]{2,6})"
address
=
r"
"+u"
([\u4e00
-
\u9fa5\·]{
6
,
20
})"
Python中针对
unicode
正则写法:
res
=
ur
"[\u4e00-\u9fa5]"
五、re常见问题
- 欢迎补充
六、参考资料
正则表达式30分钟入门教程(推荐) | https://deerchao.net/tutorials/regex/regex.htm |
python中的正则表达式(re模块) | https://www.cnblogs.com/tina-python/p/5508402.html |
Python 正则表达式 | https://thief.one/2017/10/30/1/ |
正则测试网页 | https://regex101.com/ |