Python爬虫初接触(四)

正则表达式和re模块


单字符匹配

import re
  • 匹配某个字符串:
test = 'abc'
ret = re.match('a', test)
# print(ret.group())
  • 点(.):匹配任意的字符(除了’\n’)
test = '+bc'
ret = re.match('.', test)
# print(ret.group())
  • \d:匹配任意的数字
test = '0bc'
ret = re.match('\d', test)
# print(ret.group())
  • \D:匹配任意的非数字
test = 'bc0'
ret = re.match('\D', test)
# print(ret.group())
  • \s:匹配的是空白字符(包括:\n,\r,\t和空格)
test = '\nbc0'
ret = re.match('\D', test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • \S:匹配的是非空白字符
test = 'sbc0'
ret = re.match('\D', test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • \w:匹配的是a-z和A-Z以及数字和下划线
test = 'Abc0'
ret = re.match('\D', test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • \W:匹配的是和\w相反的
test = '\nbc0'
ret = re.match('\D', test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • []组合的方式,只要满足中括号中的某一项都算匹配成功
test = '1bc0'
ret = re.match('[\S\w]', test)
# ret = re.match('[1b]', test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • 使用组合的方式实现\d
test = '1bc0'
ret = re.match('[0-9]', test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • 使用组合的方式实现\D
test = 'bc0'
ret = re.match('[^0-9]',test)
# print('-'*30)
# print(ret.group())
# print('-'*30)
  • 使用组合的方式实现\w
test = '1bc0'
ret = re.match('[a-zA-z0-9_]', test)
print('-'*30)
print(ret.group())
print('-'*30)

多字符匹配

import re
  • *:匹配0个或者多个字符
text = 'abc'
result = re.match('\w*',text)
# print(result.group())
# 匹配0个或多个字母,若为0个,则返回空
  • +:匹配1个或者多个字符
text = 'abc'
result = re.match('\w+',text)
# print(result.group())
# 若为0个,则报错
  • ?:匹配前一个字符0次或者1次
text = '1abc'
result = re.match('\w?',text)
# print(result.group())
  • {m}:匹配m个字符,m为数字
text = '1abc'
result = re.match('\w{2}',text)
# print(result.group())
  • {m,n}:匹配m-n之间的个数的字符,其中m<n,若可以匹配到n个,则返回n个
text = '1a#bc'
result = re.match('\w{1,3}',text)
# print(result.group())

re运用小案例

import re
  • 1.验证手机号码:手机号码的规则是以1开头,第二位可以是34587,后面9位随意
text = '18778899001'
result = re.match("1[34587]\d{9}", text)
# print(result.group())
  • 2.验证邮箱:邮箱的规则是邮箱名称是用数字、英文字符、下划线组成,然后是@字符,后面就是域名了
text = 'qq_2_ll@163.com'
result = re.match('\w+@[a-z1-9]+\.[a-z]+',text)
# print(result.group())
  • 3.验证URL:URL的规则是前面是http或者https或者ftps然后加上一个冒号,再加上一个斜杠,再后面就可以出现任意非空字符
text = 'https://baike.baidu.com/item/Python/407313?fr=aladdin'
result = re.match("(http|https|ftps)://\S+", text)
# print(result.group())
  • 4.验证身份证:身份证的规则是,总共有18位,前面17位是数字,后面一位可以是数字,也可以是小写的x,也可以是大写的X
text = '42092319991013001x'
result = re.match("\d{17}[\dxX]", text)
# print(result.group())

开始、结束和非贪婪

import re
  • ^:以…开头
text = "hello world"
# result = re.search("hello",text)
result = re.search("^hello",text)
# print(result.group())
  • $:以…结尾
text = "hello world"
# result = re.search("world",text)
result = re.search("world$",text)
# print(result.group())


# text1 = ""
# result = re.search("^$", text1)
# print(result.group())
  • 贪婪和非贪婪
text = "12345"
result = re.search("\d+?",text)
# print(result.group())
  • 案例1:提取html标签名称
text = "<h1>这是标签</h1>"
# result = re.search("<.+>",text)
result = re.search("<.+?>",text)
# print(result.group())
  • 案例2:验证一个字符是不是0-100之间的数字
text = "100"
result = re.match("0$|[1-9]\d?$|100$",text)
# print(result.group())

原生字符串和正则表达式

  • 正则表达式的字符串结息规则:
    1.先把这个字符串放在Python语言层面进行解析
    2.把Python语言层面解析的结果再放到正则表达式层面进行解析
text = "\cba c"
# result = re.match("\c", text)
# result = re.match("\\c", text)
# \\\\c =(Python语言层次)> \\c =(正则表达式层面)>  \c
# result = re.match("\\\\c", text)   较为复杂!
result = re.match(r"\\c", text)     
print(result.group())

常用函数

import re
  • 分组
text = "apple price is $99, orange price is $88"
result = re.search(".+(\$\d+).+(\$\d+)", text)
# print(result.group(1))

# group()/group(0):匹配整个分组
# group(1):匹配第一个分组
# group(2): 匹配第二个分组
# groups():匹配所有分组
  • findall:查找所有满足条件的
text = "apple price is $99, orange price is $88"
result = re.findall("\$\d+", text)
# print(result)
  • sub:根据规则替换其他字符串
text = "hello world"
# new_text = re.replace(r" ", "\n", text)
# print(new_text)

# sub比replace更强大
html = """
<div class="text">
    <p>1.理工科专业本科及以上学历,1年以上python实际开发经验;</p>
    <p>2.能熟练使用python语言进行日常开发工作 </p>
    <p>3.熟悉MySQL,Redis, mongo等常用组件 </p>
    <p>4.熟悉git,Nginx,linux等工具和环境 </p>
    <p>5.有较强的沟通能力,分析和解决问题能力,团队合作能力和服务意识<br>6.统本理工科硬性要求,非诚勿扰</p>
</div>
"""
new_html = re.sub(r"<.+?>","",html)
# print(new_html)
  • split:根据规则分割字符串
text = "hello world,hello ll"
new_text = re.split(r" |,",text)
# print(new_text)
  • compile:编译正则表达式
text = "apple price is 34.56"
r = re.compile(r"\d+\.?\d*")
result = re.search(r,text)
# print(result.group())
  • VERBOSE:正则表达式的注释
text = "apple price is 34.56"
r = re.compile(r"""
\d+ # 整数部分
\.? # 小数点
\d* # 小数部分
""", re.VERBOSE)
result = re.search(r,text)
# print(result.group())
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值