Web服务器 3.1
3.1.1 正则表达式
# coding = utf-8
# 导入re模块
import re
# 使用match方法操作
result = re.match(正则表达式,要匹配的字符串)
# 如果匹配到数据的话,可以用group()来提取
if result:
result.group()
else:
break
3.1.2 re模块示例(匹配以itcast开头的语句)
import re
result = re.match(r"itcast","itcasterer")
result.group()
运行的结果是:
itcast
3.1.3 匹配单个字符
序号 | 符号 | 定义 |
---|
1. |
. |
匹配任意一个字符,除了\n |
2. |
[] |
匹配[]中列举的字符 |
3. |
\d |
匹配任意数字0-9 |
4. |
\D |
匹配非数字 |
5. |
\s |
匹配空格键或TAB键 |
6. |
\S |
匹配非空格 |
7. |
\w |
匹配单字符a-z A-Z 0-9 和_ |
8. |
\W |
匹配非单字符 |
3.1.4 匹配多个字符
序号 | 符号 | 定义 |
---|
1 |
* |
匹配前一个字符出现0次或无限次,即可有可无;如:s* |
2 |
+ |
匹配前一个字符出现1次或无限次,即至少有1次 |
3 |
? |
匹配前一个字符出现1次或者0次,即要么有一次,要么没有 |
4 |
{m} |
匹配前一个字符出现m次;例:[a-z]{4,36}表示字符串为小写4-26位 |
5 |
{m,n} |
匹配前一个字符出现m-n次 |
示例1 匹配第一个字母为大写,第二个字符小写可有可无
import re
ret = re.match(r"[A-Z][a-z]*$", "Ma")
if ret:
print(ret.group())
else:
print("不能匹配")
ret = re.match(r"[A-Z][a-z]*$", "M")
if ret:
print(ret.group())
else:
print("不能匹配")
ret = re.match(r"[A-Z][a-z]*$", "MO")
if ret:
print(ret.group())
else:
print("不能匹配")
ret = re.match(r"[A-Z][a-z]*$", "mO")
if ret:
print(ret.group())
else:
print("不能匹配")
运行后的结果为
zz_03_验证邮箱是否正确.py
Ma
M
不能匹配
不能匹配
示例2:判断变量名是否符合要求
import re
def main():
names = ["age", "lage", "age1", "age_1", "age!", "a#1224", "___ __", "_Mare_*"]
for name in names:
data = re.match(r"[a-zA-Z_][a-zA-Z0-9_]*$", name)
if data:
print("变量名%s正确" % name)
else:
print("变量名%s不正确" % name)
if __name__ == "__main__":
main()
运行结果
变量名age正确
变量名lage正确
变量名age1正确
变量名age_1正确
变量名age!不正确
变量名a#1224不正确
变量名___ __不正确
变量名_Mare_*不正确
3.1.5 匹配开头和结尾
序号 | 表达式 | 说明 |
---|
1 |
^ |
匹配字符串的开头 |
2 |
$ |
匹配字符串的结尾 |
示例3 判断163邮箱是否正确
import re
def email(email_adr):
adr = re.match(r"[a-zA-Z1-9][A-Za-z1-9_]{3,19}@163\.com$", email_adr)
if adr:
print("邮箱地址%s 正确" % email_adr)
else:
print("邮箱地址%s 不正确" % email_adr)
while True:
email_adr_in = input("请输入你的邮箱地址(退出输exit):")
if email_adr_in == "exit" or email_adr_in == "EXIT":
break
else:
email(email_adr_in)
运行结果
请输入你的邮箱地址(退出输exit):zhao@163.com
邮箱地址zhao@163.com 正确
请输入你的邮箱地址(退出输exit):1wangwu@163.com
邮箱地址1wangwu@163.com 正确
请输入你的邮箱地址(退出输exit):_wangwu@163.com
邮箱地址_wangwu@163.com 不正确
请输入你的邮箱地址(退出输exit):@123@163.com
邮箱地址@123@163.com 不正确
请输入你的邮箱地址(退出输exit):12345@1632.com
邮箱地址12345@1632.com 不正确
请输入你的邮箱地址(退出输exit):EXIT
进程已结束,退出代码 0
3.1.6 正则表达式 分组
序号 | 字符 | 功能 |
---|
1 |
I |
匹配左右任意一个表达式 |
2 |
(ab) |
将括号中的字符作为一个分组 |
3 |
\num |
引用分组num匹配到字符串 |
4 |
(?p) |
分组起别名 |
5 |
(?P=nmae) |
引用别名为name分组匹配到的字符串 |
示例4 (?P)和(?P=name)的使用
import re
text1 = "<body><h1>welcome to Jaguar and Landrover</h1></body>
ret = re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>",text)
print(ret.group())
3.1.7 re模块的其它高级用法
search 示例 匹配出文章阅读次数
import re
ret = re.search(r"\d+),"阅读次数为999")
ret.group()
运行结果:
‘999’
findall示例 统计出python c c++相应的阅读次数
import re
ret = re.findall(r"\d+","python = 1212, c = 5454, c++ = 2343")
print(ret)
运行结果:
['1212', '5454', '2343']
sub的应用 示例:sub 将替换程序中的所有任合值
In [75]: re.sub(r"\d+",'999',"python = 123, c = 234, c++ = 456")
Out[75]: 'python = 999, c = 999, c++ = 999'
sub案例2,将统计到的次数加1
"""sub在调用函数功能"""
import re
def add(number):
temp_num = number.group()
num = int(temp_num) + 1
return str(num)
ret = re.sub(r"\d+", add, "python = 1314")
print(ret)
ret = re.sub(r'\d+', add, "python = 1232, c++ = 3454")
print(ret)
运行结果:
python = 1315
python = 1233, c++ = 3455
进程已结束,退出代码 0
split切割字符用
In [76]: re.split(r":| ","python:google c++ 444: american")
Out[76]: ['python', 'google', 'c++', '444', '', 'american']
总结高级功能
序号 | 命令 | 功能 |
---|
1 |
search |
查找字符串中相应的数字或字符,只会找出一个 |
2 |
findall |
查找出字符串中所有的数据或字符,找出所有,并反回列表 |
3 |
sub |
将找出的相应的结果替换掉,替换所有 |
4 |
split |
按照设定的规格进行切割,并返回列表 |
练习题 将网页上抓取的信息,递出其中的特殊符号,并重新排版打印
#coding:utf-8
import re
text = "<p>岗位职责<br>1、参与系统的需求调研和需求分析 ;<br>2、搭建系统开发环境,完成系统框架和核心代码的实现;<br>3、负责java性能分析软件的开发;<br>4、系统开发测试、部署和集成;<br>5、负责解决开发过程中的技术问题;<br>6、参与代码维护与备份。<br> <br>我们的要求<br>1. 1年以上的java/C#/C++/Ruby/Python等语言开发经验
;<br>2. 熟悉OO;<br>3. 熟悉SQL、NoSQL等主流数据库;<br>4. 有良好的编程风格,能够书写规范、优质的代码
;<br>5. 良好的团队协作能力;<br> <br>如果你还具备以下技能那就更好了:<br>1. 喜欢阅读源代码;<br>2. 热爱阅读各类技术、非技术书籍;<br>3. 喜欢学习,拥有持续学习的能力,认为学习本身就是一种乐趣;<br>4. 喜欢开源软件,乐于知识分享;<br>5. 拥有自我管理能力,自我驱动,做自己的老板。</p>"
new_text = re.sub(r"(<[\w/]*>| )", "", text)
new_text = re.sub(r"\.|、", "", new_text)
new_list = re.split(r"\d+",new_text)
n = 1
for cut_text in new_list:
if cut_text:
print(n, ".\t", cut_text)
n += 1
else:
break
运行的结果如下:
1 . 岗位职责
2 . 参与系统的需求调研和需求分析;
3 . 搭建系统开发环境,完成系统框架和核心代码的实现;
4 . 负责java性能分析软件的开发;
5 . 系统开发测试部署和集成;
6 . 负责解决开发过程中的技术问题;
7 . 参与代码维护与备份。我们的 8 .
9 . 年以上的java/C#/C++/Ruby/Python等语言开发经验;
10 . 熟悉OO;
11 . 熟悉SQLNoSQL等主流数据库;
12 . 有良好的编程风格,能够书写规范优质的代码;
13 . 良好的团队协作能力;如果你还具备以下技能那就更好了:
14 . 喜欢阅读源代码;
15 . 热爱阅读各类技术非技术书籍;
16 . 喜欢学习,拥有持续学习的能力,认为学习本身就是一种乐趣;
17 . 喜欢开源软件,乐于知识分享;
18 . 拥有自我管理能力,自我驱动,做自己的老板。
进程已结束,退出代码 0