正则表达式说明与案例

1.正则表达式的定义正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
10000~ 12数字组合09876536
1.长度
2.是否是0开头

正则表达式是对字符串(包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular
Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
Regular
Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”、“规律”的意思,Regular
Expression即“描述某种规则的表达式”之意。
正则在所有语言中都有的内容。


2.正则表达式的作用和特点给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1.给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
2.可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式的特点是:
1.灵活性、逻辑性和功能性非常强;
2.可以迅速地用极简单的方式达到字符串的复杂控制。
3.对于刚接触的人来说,比较晦涩难懂。

正则表达式:

import re
re.match(pattern,str)
re.search(pattern,str)
re.findall(pattern,str)
re.sub(pattern,'新的内容',str)  #替换
re.split(pattern,str)  ---> []
基础:
. 任意字符
[] 范围
|  或者
()  一组

量词:
 *  >=0
 +  >=1
 ?  0,1
 {m}  = m
 {m,} >=m
 {m,n}  >=m  <=n

 预定义:
\A:表示从字符串的开始处匹配
\Z:表示从字符串的结束处匹配,如果存在换行,只匹配到换行前的结束字符串。
\b:匹配一个单词边界,也就是指单词和空格间的位置。例如, 'py\b' 可以匹配"python" 中的 'py',但不能匹配 "openpyxl" 中的 'py'。
\B:匹配非单词边界。 'py\b' 可以匹配"openpyxl" 中的 'py',但不能匹配"python" 中的 'py'。
\d:匹配任意数字,等价于 [0-9]。  digit
\D:匹配任意非数字字符,等价于 [^\d]。not digit
\s:匹配任意空白字符,等价于 [\t\n\r\f]。 space
\S:匹配任意非空白字符,等价于 [^\s]。
\w:匹配任意字母数字及下划线,等价于[a-zA-Z0-9_]。
\W:匹配任意非字母数字及下划线,等价于[^\w]
\\:匹配原义的反斜杠\。


‘.’用于匹配除换行符(\n)之外的所有字符。
‘^’用于匹配字符串的开始,即行首。
‘$’用于匹配字符串的末尾(末尾如果有换行符\n,就匹配\n前面的那个字符),即行尾。

 定义正则验证次数:
    ‘*’用于将前面的模式匹配0次或多次(贪婪模式,即尽可能多的匹配) >=0
    ‘+’用于将前面的模式匹配1次或多次(贪婪模式) >=1
    ‘?’用于将前面的模式匹配0次或1次(贪婪模式) 0 ,1
    '{m}'  用于验证将前面的模式匹配m次
    '{m,}'用于验证将前面的模式匹配m次或者多次  >=m
    '{m,n}'   用于验证将前面的模式匹配大于等于m次并且小于等于n次

    ‘*?,+?,??’即上面三种特殊字符的非贪婪模式(尽可能少的匹配)。
    ‘{m,n}’用于将前面的模式匹配m次到n次(贪婪模式),即最小匹配m次,最大匹配n次。
    ‘{m,n}?’即上面‘{m,n}’的非贪婪版本。
    ‘\\’:'\'是转义字符,在特殊字符前面加上\,特殊字符就失去了其所代表的含义,比如\+就仅仅代表加号+本身。
    ‘[]’用于标示一组字符,如果^是第一个字符,则标示的是一个补集。比如[0-9]表示所有的数字,[^0-9]表示除了数字外的字符。
    ‘|’比如A|B用于匹配A或B。
    ‘(...)’用于匹配括号中的模式,可以在字符串中检索或匹配我们所需要的内容。

分组:
()   ---> group(1)

number
  (\w+)(\d*)   ---> group(1)  group(2)
  引用:
  (\w+)(\d*)   \1  \2  表示引用前面的内容

name
  (?P<name>\w+)   (?P=name)


Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;

非贪婪则相反,总是尝试匹配尽可能少的字符。

在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
import re
# 起名的方式:  (?P<名字>正则) (?P=名字)
msg = '<html><h1>abc</h1></html>'
result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>', msg)
print(result)
print(result.group(1))
print(result.group(2))
print(result.group(3))
'''
 分组:()   ---> result.group(1) 获取组中匹配内容  
       在分组的时候还可以结合 |
       result = re.match(r'(\d{3}|\d{4})-(\d{8})$', phone)
        print(result)

 不需要引用分组的内容:
    result = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>', msg)
    print(result)
    print(result.group(1))
引用分组匹配内容:
    1.number   \number 引用第number组的数据
        msg = '<html><h1>abc</h1></html>'
        result = re.match(r'<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</\2></\1>$',msg)
        print(result)

    2.?P<名字>
        msg = '<html><h1>abc</h1></html>'
        result = re.match(r'<(?P<name1>\w+)><(?P<name2>\w+)>(.+)</(?P=name2)></(?P=name1)>',msg)
        print(result)
        print(result.group(1))


    re模块:
    match    从开头匹配一次
    search   只匹配一次
    findall  查找所有
    sub(正则表达式,'新内容',string)   替换
    split   result = re.split(r'[,:]','java:99,python:95')   在字符串中搜索如果遇到:或者,就分割
            将分割的内容都保存到列表中了
'''

def func(temp):
    num = temp.group()
    num1 = int(num) + 1
    return str(num1)


# result = re.sub(r'\d+','90','java:99,python:95')
# print(result)


result = re.sub(r'\d+', func, 'java:99,python:95')
print(result)

result = re.split(r'[,:]', 'java:99,python:95')
print(result)
# qq = input('输入qq号码')
# if len(qq) >= 5 and qq[0] != '0':
#     print('合法的')
# else:
#     print('不合法的')

import re

msg = '佟丽娅娜扎热巴代斯'

pattern = re.compile('佟丽娅')

result = pattern.match(msg)  # 没有匹配
print(result)

# 使用正则re模块方法: match

s = '娜扎热巴代斯佟丽娅'

result = re.match('佟丽娅', s)  # 只要从开头进行匹配,如果匹配不成功则就返回None
print(result)

result = re.search('佟丽娅', s)  # search 进行正则字符串匹配方法,匹配的是整个字符串
print(result)

print(result.span())  # 返回位置

print(result.group())  # 使用group提取到匹配的内容
print(result.groups())

# a2b h6k
# [] 表示的是一个范围

s = '哈哈3u'

result = re.search('[0-9][a-z]', s)
print(result)

msg = 'abcd7yjkfd8hdf00'

result = re.search('[a-z][0-9][a-z]', msg)  # search 只要有匹配的后面就不会继续进行检索,找到一个匹配的就会停止
print(result.group())

result = re.findall('[a-z][0-9][a-z]', msg)  # findall 匹配整个字符串,找到一个继续向下找一直到字符串结尾
print(result)
# 正则符号

# a7a  a88a a7878a
msg = 'a7aopa88akjgka7878a'

result = re.findall('[a-z][0-9]+[a-z]', msg)
print(result)

# qq号码验证 5~11 开头不能是0
qq = '14944689962'
result = re.match('^[1-9][0-9]{4,10}$', qq)
print(result)

# 用户名可以是字母或者数字_, 不能是数字开头,用户名长度必须6位以上 [0-9a-zA-Z]

username = 'admin001'
result = re.search('^[a-zA-Z]\w{5,}$', username)
print(result)

msg = 'a*py ab.txt bb.py kk.png uu.py apyb.txt'
result = re.findall(r'\w*\.py\b', msg)
print(result)

'''
 总结:
  . 任意字符除(\n)
  ^ 开头
  $ 结尾
  [] 范围  [abc]  [a-z]  [a-z*&¥]

  正则预定义:
  \s  空白 (空格)
  \b 边界
  \d 数字
  \w  word  [0-9a-zA-Z_]

  大写反面 \S  非空格  \D  非数字 。。。

  '\w[0-9]' ---> \w  [0-9] 只能匹配一个字母 

  量词:
   *  >=0
   +  >=1
   ?  0,1

   手机号码正则
   re.match('1[35789]\d{9}$',phone)

  {m} : 固定m位
  {m,}  >=m
  {m,n}  phone > =m   phone<=n

'''
import re

# 分组
# 匹配数字0-100数字
n = '100'
'''
| 或者  
() 分组 (163|126|qq)  一组
'''
# 改进版
result = re.match(r'[1-9]?\d?$|100$', n)
print(result)

# (word|word|word)  区别   [163] 表示的是一个字母而不是一个单词
# 验证输入的邮箱 163  126  qq
email = '73877884@163.com'
result = re.match(r'\w{5,20}@(163|126|qq)\.(com|cn)$', email)
print(result)

# 不是以4、7结尾的手机号码(11位)

phone = '15901018869'
result = re.match(r'1\d{9}[0-35-689]$', phone)
print(result.group())

# 爬虫
phone = '010-12345678'

result = re.match(r'(\d{3}|\d{4})-(\d{8})$', phone)
print(result)

# 分别提取
print(result.group())
# () 表示分组  group(1) 表示提取到第一组的内容   group(2)表示第二组的内容
print(result.group(1))
print(result.group(2))

#
msg = '<html><h1>abc</h1>'
msg1 = '<h1>hello</h1>'

result = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>', msg)
print(result)
print(result.group(1))

# number
result = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$', msg1)
print(result)
print(result.group(1))
print(result.group(2))

#
msg = '<html><h1>abc</h1></html>'

result = re.match(r'<([0-9a-zA-Z]+)><([0-9a-zA-Z]+)>(.+)</\2></\1>$', msg)
print(result)

print(result.group(1))
print(result.group(2))
print(result.group(3))

 贪婪与非贪婪例子

​​​​​​​import re

# 默认是贪婪的,如果想将贪婪模式变成非贪婪模式
msg = 'abc123abc'

result = re.match(r'abc(\d+?)', msg)

print(result)

path = '<img class="BDE_Image" src="http://imgsrc.baidu.com/forum/w%3D580/sign=30a7526a9282d158bb8259b9b00b19d5/704bde177f3e67092893917b35c79f3dfadc55f5.jpg" size="2227636" changedsize="true" width="560" height="840" style="cursor: url(&quot;http://tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur&quot;), pointer;">'

result = re.match(r'<img class="BDE_Image" src="(.*?)"', path)
# print(result.group(1))
image_path = result.group(1)
import requests

response = requests.get(image_path)

with open('aa.jpg', 'wb') as wstream:
    wstream.write(response.content)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值