python学习—正则表达式

1.字符串中startswith的用法

txt = ['mooc yuwen','mooc shuxue mooc','mooc yingyu','wuli','huaxue','shengwu']
for item in txt:
    if item.startswith('mooc'):#字符串中的startswith的用法
        print(item)
for item in txt:
    if item.startswith('mooc') and item.endswith('mooc'):#字符串中的endswith的用法
        print(item)
a = '_value'
a and (a[0] == '_' or 'a'<= a[0]<='z') #判断第一个位置是下划线还是字母
mooc yuwen
mooc shuxue mooc
mooc yingyu
mooc shuxue mooc

2.re中的match使用

import re
str1 = 'imooc python'
pa = re.compile(r'imooc')#找开头的字符
ma = pa.match(str1)#用match调用正则编译的字符串
ma.group()
ma.span()#找到imooc在字符串中的位置

pa2 = re.compile(r'mooc',re.I)#I是ignore的开头字母,即忽略大小写
ma2 = pa2.match('MOOC th MOOC')
ma2.group()

ma3 = re.match(r'imooc',str1)
ma3.group()

3.re匹配一个字符的情况

ma = re.match('.','if') #'.'可以表示任何的一个字符
print(ma.group())
ma2 = re.match('{.}','{a}')
print(ma2.group())
ma3 = re.match('{[a-z]}','{r}') #在[]中的a-z表示从a到z的所有的26个字符,注意一定要有[]
print(ma3.group())
ma4 = re.match('{[a-zA-Z0-9]}','{R}')#若想添加另外一个大写的字母匹配,可以再增加一个A-Z,还可加0-9
print(ma4.group())
ma5 = re.match('{[\w]}','{0}') #此时可以用\w来代替a-zA-Z0-9
print(ma5.group())
ma6 = re.match('{[\D]}','{ }') #要是想匹配一个空格则需要用\W或者\D,而\d是匹配数字型字符
print(ma6.group())
ma7 = re.match('\[[\w]\]','[e]')
print(ma7.group()) #对于[]有特殊意义,需要用转义符进行转义才能使用
i
{a}
{r}
{R}
{0}
{ }
[e]

4.re匹配多个字符的情况


ma = re.match(r'[A-Z][a-z]','Aa') #此时匹配的是两个字符串,并且字符串的顺序与规则的大小写顺序不能更换
print(ma.group())
# *匹配前一个字符0次或者无限次
ma1 = re.match(r'[A-Z][a-z]*','Aa') #此时加了*后只管字符串中第一个字符能不能满足条件,其他的字符元素不管,若没*号则不行
print(ma1.group())
ma2 = re.match(r'[A-Z][a-z]*','Serhargharth') #此时要求是字符串第一个元素要大写
print(ma2.group())
ma3 = re.match(r'[A-Z][a-z]*','Seaith6er') #此时不能匹配到数字部分及以后的元素
print(ma3.group())
# +匹配前一个字符一次或者无限次
ma4 = re.match(r'[_a-zA-Z]+[\w]*','_Aerfe4')
print(ma4.group())
# ?匹配前一个字符0次或者1次
ma5 = re.match(r'[1-9]?[0-9]','99') #匹配一个0-99范围内的数字,即十位数1-9可有可无,但个位数0-9必须要有
print(ma5.group())
ma6 = re.match(r'[1-9]?[0-9]*','09') #在后面加*号才能匹配到09
print(ma6.group())
# {m},{m,n}匹配前一个字符m次或者m到n次
ma7 = re.match(r'[\w]{6}','Adb162') #对a-zA-Z0-9匹配6次,但是若匹配字符长度超过6位,也只能匹配到前6位
print(ma7.group())
ma8 = re.match(r'[\w]{6,10}@163.com','zoufyuan@163.com') #匹配一个163的邮箱,前面可以是6-10个字符长度 
print(ma8.group())
# *?/+? /??匹配模式变为非贪婪(尽可能少匹配字符)
ma9 = re.match(r'[0-9][a-z]*','1dib')
print(ma9.group())
ma10 = re.match(r'[0-9][a-z]*?','1dib') #ma10与ma9进行对比发现?的作用是尽量少匹配
print(ma10.group())
ma11 = re.match(r'[0-9][a-z]+?','3ehf') #因为+是匹配一次或者是无限次,但是加了?后只会匹配一次,不会把后面的字符串再进行匹配
print(ma11.group())
Aa
Aa
Serhargharth
Seaith
_Aerfe4
99
09
Adb162
zoufyuan@163.com
1dib
1
3e

5.re进行边界匹配


#^ 匹配字符串开头,$匹配字符串结尾
ma = re.match(r'^www.[\w]{4,10}.com$','www.baidu.com')#一定要以www开头,.com结尾
print(ma.group())
# \A / \Z 指定的字符串必须出现在开头/结尾
ma1 = re.match(r'\Aimooc[\w]*','imoocpython')
print(ma1.group())
www.baidu.com
imoocpython

6.re进行分组匹配

# \ 代表匹配任意一个表达式
ma = re.match(r'abc|d','abc') #取或操作
print(ma.group())
ma1 = re.match(r'[1-9]?\d$|[0-9][0-9][\w]$','999')
print(ma1.group())
# (ab)表示括号中表达式作为一个分组
ma2 = re.match(r'[\w]{4,10}@(163|126).com','zoufyuan@126.com')
print(ma2.group())
# \<number>引用编号为num的分组匹配到的字符串
ma3 = re.match(r'<([\w]+>)\1','<book>book>')
print(ma3.group())
ma4 = re.match(r'<([\w]+>)[\w]+</\1','<book>python</book>')
print(ma4.group())
#(?P<name>) 给分组起一个别名
ma5 = re.match(r'<(?P<mark>[\w]+>)[\w]+</(?P=mark)','<book>python</book>') #此时效果和ma4等价
print(ma5.group())
# (?P=name)引用别名为name的分组匹配字符串,见ma5的相关应用
abc
999
zoufyuan@126.com
<book>book>
<book>python</book>
<book>python</book>

7.re中的其他方法

#search(pattern,string,flags = 0),在一个字符串中查找匹配
str1 = 'imooc have 1000'
info1 = re.search(r'\d+',str1)
print(info1.group())


#findall(pattern,string,flags = 0),找到匹配,返回所有匹配部分的列表
str2 = 'c++ = 100,java = 90,python = 80'
info2 = re.findall(r'\d+',str2)
print(info2)


#sub(pattern,repl,string,count = 0,flags = 0)将字符串中匹配正则表达式的部分替换成其他值
str3 = 'imooc have 1000'
info3 = re.sub(r'\d+','10001',str3)
print(info3)
def add1(match):
    val = match.group()
    num = int(val) +1
    return str(num)
info_3 = re.sub(r'\d+',add1,str3) #可以将自定义的函数传入sub中,此时是身体str3中满足r'\d'的字符串传入add1中
print(info_3)


#split(pattern,string,maxsplit=0,flags = 0) 根据匹配分割字符串,返回分割字符串组成的列表
str4 = 'imooc:c c++ java python'
info4 = re.split(r':| ',str4)
print(info4)
1000
['100', '90', '80']
imooc have 10001
imooc have 1001
['imooc', 'c', 'c++', 'java', 'python']

8.利用正则表达式爬虫

import requests #获取页面
from bs4 import BeautifulSoup #解析网页
import urllib
url = 'http://www.58pic.com/tupian/gaokaojiayou.html'
rawhtml = requests.get(url).content#先用request去get url 得到里面的content
soup = BeautifulSoup(rawhtml, 'html.parser') 
#print(soup)
plist = re.findall(r'http://.+.jpg',soup.decode('utf-8'))
i = 0
for url in plist:
    f = open('C:\\Users\\zou\\Desktop\\picture\\'+'高考加油'+str(i)+'.jpg','wb')
    req = urllib.request.urlopen(url)
    buf = req.read()
    f.write(buf)
    i+=1
    f.close()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值