概述
正则表达式使用场景:
1.验证客户端用户输入的数据是否符合规范
2.爬取到网页内容后,精准挑选出我们要的信息
3.在一个文件中,找到含有itcast的语句
re模块操作
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()
示例:
import re
result = re.match("itprojects", "itprojects.cn")
ret = result.group()
print(ret)
运行结果为:
itprojects
匹配字符(重点)
字符 | 功能 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式(下面说明) |
re{ n} | 匹配n个前面表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。 |
re{ n,} | 精确匹配n个前面表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a| b | 匹配a或b |
\w | 匹配数字字母下划线 |
\W | 匹配非数字字母下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]。 |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]。 |
\D | 匹配任意非数字 |
以上是比较常用的 。
解释一下什么是贪婪方式
比如一个字符串s = 'booobby',我想提取前两个'b'及其中间夹的子串
import re
s = 'booobby'
regular_expression = '.*(b.*b)'
ret = re.match(regular_expression,s)
print(ret.group(1))
输出的结果就是bb
贪婪可以认为它是从后往前找的,但是输出的顺序不变。
import re
s = 'booobacby'
regular_expression = '.*(b.*b)'
print(re.match(regular_expression , s).group(1))
输出结果是bacb
那么我们想要前面的booob该怎么办?
就是在两个b前面加一个?,注意两个都要加。
让我们来匹配一个163.com的邮箱地址
import re
email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang@qq.com"]
for email in email_list:
ret = re.match("[\w]{4,20}@163\.com", email)
if ret:
print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
else:
print("%s 不符合要求" % email)
'''
我来解释一下
[\w]{4,20}表示匹配数目大于等于4且小于等于20的任意字母、数字、下划线
等价于[a-zA-Z_]
\.就是转义,匹配一个.
'''
是不是很简单?
想了解re常用的几个函数请看下一篇文章:
补充材料:
修饰符 | 描述 |
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |