第五天,讲真有点吃力了,因为需要记忆的内容有些多了。
先来看什么是正则表达式,以下内容来自百度百科。正则表达式又称规则表达式,(Regular Expression,代码中简写为regex、regexp或RE),计算机科学的一个概念。通常被用来检索,替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
符号 | 解释 | 示例 | 说明 |
---|---|---|---|
. | 匹配任意字符 | b.t | 可以匹配bat / but / b#t / b1t等 |
\w | 匹配字母/数字/下划线 | b\wt | 可以匹配bat / b1t / b_t等 但不能匹配b#t |
\s | 匹配空白字符(包括\r、\n、\t等) | love\syou | 可以匹配love you |
\d | 匹配数字 | \d\d | 可以匹配01 / 23 / 99等 |
\b | 匹配单词的边界 | \bThe\b | |
^ | 匹配字符串的开始 | ^The | 可以匹配The开头的字符串 |
$ | 匹配字符串的结束 | .exe$ | 可以匹配.exe结尾的字符串 |
\W | 匹配非字母/数字/下划线 | b\Wt | 可以匹配b#t / b@t等 但不能匹配but / b1t / b_t等 |
\S | 匹配非空白字符 | love\Syou | 可以匹配love#you等 但不能匹配love you |
\D | 匹配非数字 | \d\D | 可以匹配9a / 3# / 0F等 |
\B | 匹配非单词边界 | \Bio\B | |
[] | 匹配来自字符集的任意单一字符 | [aeiou] | 可以匹配任一元音字母字符 |
[^] | 匹配不在字符集中的任意单一字符 | [^aeiou] | 可以匹配任一非元音字母字符 |
* | 匹配0次或多次 | \w* | |
+ | 匹配1次或多次 | \w+ | |
? | 匹配0次或1次 | \w? | |
{N} | 匹配N次 | \w{3} | |
{M,} | 匹配至少M次 | \w{3,} | |
{M,N} | 匹配至少M次至多N次 | \w{3,6} | |
| | 分支 | foo|bar | 可以匹配foo或者bar |
(?#) | 注释 | ||
(exp) | 匹配exp并捕获到自动命名的组中 | ||
(? |
匹配exp并捕获到名为name的组中 | ||
(?:exp) | 匹配exp但是不捕获匹配的文本 | ||
(?=exp) | 匹配exp前面的位置 | \b\w+(?=ing) | 可以匹配I’m dancing中的danc |
(?<=exp) | 匹配exp后面的位置 | (?<=\bdanc)\w+\b | 可以匹配I love dancing and reading中的第一个ing |
(?!exp) | 匹配后面不是exp的位置 | ||
(? | 匹配前面不是exp的位置 | ||
*? | 重复任意次,但尽可能少重复 | a.*b a.*?b |
将正则表达式应用于aabab,前者会匹配整个字符串aabab,后者会匹配aab和ab两个字符串 |
+? | 重复1次或多次,但尽可能少重复 | ||
?? | 重复0次或1次,但尽可能少重复 | ||
{M,N}? | 重复M到N次,但尽可能少重复 | ||
{M,}? | 重复M次以上,但尽可能少重复 |
re模块来进行正则表达式的操作,核心函数如下
函数 | 说明 |
---|---|
compile(pattern, flags=0) | 编译正则表达式返回正则表达式对象 |
match(pattern, string, flags=0) | 用正则表达式匹配字符串 成功返回匹配对象 否则返回None |
search(pattern, string, flags=0) | 搜索字符串中第一次出现正则表达式的模式 成功返回匹配对象 否则返回None |
split(pattern, string, maxsplit=0, flags=0) | 用正则表达式指定的模式分隔符拆分字符串 返回列表 |
sub(pattern, repl, string, count=0, flags=0) | 用指定的字符串替换原字符串中与正则表达式匹配的模式 可以用count指定替换的次数 |
fullmatch(pattern, string, flags=0) | match函数的完全匹配(从字符串开头到结尾)版本 |
findall(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回字符串的列表 |
finditer(pattern, string, flags=0) | 查找字符串所有与正则表达式匹配的模式 返回一个迭代器 |
purge() | 清除隐式编译的正则表达式的缓存 |
re.I / re.IGNORECASE | 忽略大小写匹配标记 |
re.M / re.MULTILINE | 多行匹配标记 |
练习一:匹配正确的电话号码
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:验证输入的手机号码
import re
def main():
# 验证手机号码
# 移动号码段: 139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
# 联通号码段: 130、131、132、136、185、186、145
# 电信号码段: 133、153、180、189
tel = input("请输入你的电话号码:")
if tel.isdigit():
m1 = re.match(r'(13[0-9])|(14[5|7])|(15[0-3]|[7-9])|(18[023]|[5-9])/d{8}$', tel)
if not m1:
print("请输入正确的手机号")
else:
print("您的手机号为%s" % tel)
if __name__ == "__main__":
main()
练习二:替换指定内容到行尾
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:正则表达式替换,从文件中读取文本,进行替换,abc后面的替换为' def'
import re
def main():
try:
with open('text.txt', 'r', encoding='utf-8') as file:
with open('text_update.txt', 'a', encoding='utf-8') as file1:
for line in file.readlines():
file1.write(re.sub(r'abc.*', 'abc def', line))
except FileNotFoundError:
print("未找到文件")
except LookupError:
print("指定了未知的编码")
except UnicodeDecodeError:
print("解码错误")
if __name__ == "__main__":
main()
text.txt
abc 123123
asd abcdea
sdfas
abcsdf1_
text_update.txt
abc def
asd abc def
sdfas
abc def
练习三:数字替换
#!usr/bin/python
# -*- coding: utf-8 -*-
# author: 李爽
# description:数字替换
# 把asdadas123asdasdas456asdasdasd789asdasd替换为:
# asdadas[123]asdasdas[456]asdasdasd[789]asdasd
import re
def main():
source_str = 'asdadas123asdasdas456asdasdasd789asdasd'
select_strs = re.findall(r'([0-9]*[0-9])', source_str)
replace_str = source_str
for select_str in select_strs:
replace_str = re.sub(select_str, '['+select_str+']', replace_str, 1)
print(replace_str)
if __name__ == "__main__":
main()
写爬虫类应用的是否,正则表达式可以大展身手,我们可以循序的从网页代码中发现我们指定的模式并提取出我们需要的信息。
第五天,因为有些事情只能写这么多了。明天继续吧。
如果你发现我的文章哪里有错误或者有什么好的想法可以联系我,我们一起学习共同进步,我的邮箱地址是[email protected]
let’s do more of those!