正则表达式(基础)

1,概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

2,元字符

字符描述
.匹配除 “\n” 之外的任何单个字符.
[xyz]匹配所包含的任意一个字符
[^xyz]匹配未包含的任意字符
[a-z]匹配指定范围内的任意字符
[^a-z]匹配任何不在指定范围内的任意字符
1.匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。
2.匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,‘n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘’ 匹配 “” 而 “(” 则匹配 “(”。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。

3,模式修正符

re.I : 使匹配对大小写不敏感

4,贪婪模式与懒惰模式

.*? 或 .+? 的使用为懒惰模式
.* 或 .+ 的使用为贪婪模式

5,正则表达式中的常用函数

1,匹配函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是则返回none。
re.search 扫描整个字符串并返回第一个成功的匹配。

group() 返回被 RE 匹配的字符串。
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置

re.match与re.search的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表
2,分割函数
按照能够匹配的子串将string分割后返回列表。可以使用re.split来分割字符串,如:re.split(r’\s+’, text);将字符串按空格分割成一个单词列表。
格式:re.split(pattern, string[, maxsplit])maxsplit: 用于指定最大分割次数,不指定将全部分割。
3,替换函数
re.sub 使用re替换string中每一个匹配的子串后返回替换后的字符串。
格式:re.sub(pattern, repl, string, count)
re.subn 使用re替换string中每个匹配的子串后返回替换后的字符串和替换次数组成的元组。
格式:re.subn(pattern, repl, string, count,flags=0)

import re
# 从头开始匹配3个数字
print(re.match("[0-9]{3}", "qw4567erty"))
# 匹配3个数字
print(re.search("[0-9]{3}", "eee909090r899ty"))

print(re.match("[0-9]{3}", "9090r899ty"))
print(re.search("[0-9]{3}", "9090r899ty"))

print(re.search("[0-9]{3}", "wewewewwe345ert567ysad678faf"))


import re

str = "ert2345yuk6789ihgf5432dsd5679fgh4532jjhds"
# 从头开始匹配4个数字
print(re.findall("[0-9]{4}", str))
print(re.finditer("[0-9]{4}", str))

dd = re.finditer("[0-9]{4}", str)
for i in dd:
    print("contact:", i.group(), "    ", "range of index:", i.span())
for i in dd:
    print("contact:", i.group(), "    ", "range of index:", i.span())   # 打印不了



# 正则模块中的函数介绍(方法)--分割、替换
import re

str = "12;34:56,78:98@76;50"

print(re.split("[^0-9]", str))
print(re.sub("[^0-9]", ":", str))
print(re.subn("[^0-9]", ":", str))
print("="*60)
str = "04/25/2020"
# 将上面的日期格式转成中文的年月日格式
print(re.sub(r'([0-9]{2})/([0-9]{2})/([0-9]{4})', r"\3-\1-\2", str))
import re

str = "<b>aaaa</b><b>bbbb</b><b>cccc</b>"

print(re.findall("<b>([a-z]+)</b>",str))

print(re.findall("<b>.*</b>",str)) #贪婪匹配(最大匹配)
print(re.findall("<b>.*?</b>",str)) #拒绝贪婪匹配(最小匹配)

#想把b标签替换成i
print(re.sub(r"<b>(.*?)</b>",r"<i>\1</i>",str))``
#将下面子串中的内容匹配出来
import re
str='''
    <ul>
        <li><a href="https://www.python.org">Python官方网站</a></li>
        <li><a href="https://www.djangoproject.com">Django官方网站</a></li>
        <li><a href="https://www.baidu.com">百度搜索引擎
        </a></li>
        <li><a href="https://www.163.com">网易官网</a></li>
    </ul>
    '''

dd = re.findall('<a href="(.*?)">(.*?)</a>',str,re.S)

for row in dd:
    print(row)

https://www.bilibili.com/video/BV1ZV411Y7rJ?spm_id_from=333.999.0.0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值