day18 - regular正则表达式

day17回顾

1.文件操作

打开文件,文件读写,关闭文件
with open(文件路径,打开方式,encoding='utf-8') as 文件对象:
文件对象.read() - 读
文件对象.write(内容) - 写

2.json数据

json数据: 一个json有且只有一个数据;这个数据类型是json支持的数据类型
number,string,boolean,array(list),dictionary(dict),null(None)

json数据转python数据:
json.loads(字符串,编码类型) - 数据操作
json.load(字符串) - 文件操作
python数据转json数据:
json.dumps(python数据) - 数据操作
json.dump(python数据,文件对象) - 文件操作

regular

1.什么是正则表达式

正则表达式是字符串匹配工具,它是为了在某些需求下可以更方便,更快速的处理字符串

2.什么是正则表达式处理字符串

python通过提供re模块来支持我卖你正则表达式

re.fullmatch(正则表达式,字符串) - 让正则表达式和字符串进行完全匹配,返回匹配街故宫,如果匹配不成功返回None

3.怎么写正则表达式

python中正则表达式是放在字符串中,并且这个字符串一般会在最前面加r/R
r'正则'

4.正则语法

    1. 普通字符 - 代表字符本身
re_str = r'abc'
result = re.fullmatch(re_str, 'abc')
print(result)
    1. . - 匹配一个任意字符
一个 . 代表一个字符,匹配的是任意字符
# 匹配一个字符串,长度是4,第一个字符是任意字符,后面三位是'abc'
re_str = r'.abc'
result = re.fullmatch(re_str, '1abc')
print(result)
    1. \w - 匹配一个ASCII表中字母,数字或者下划线,还可以匹配所有的非ASCII表字符
re_str = r'.\w'
result = re.fullmatch(re_str, 'ss')
print(result)
    1. \s - 匹配一个空白字符
空白字符包括:空格,回车,制表符

# 匹配一个字符串有4个字符,第一个字符是空白,后面三个任意字符
re_str = r'\s...'
result = re.fullmatch(re_str, '\t456')
print(result)
    1. \d - 匹配一个数字字符
# 匹配一个字符串长度是5,前面三个字符是成绩:后面是两个数字
re_str = r'成绩:\d\d'
result = re.fullmatch(re_str, '成绩:44')
print(result)
    1. \b - 检测单词边界(检测\b是否是单词边界)
单词边界:所有能够标示一个单词结束的符号都是单词边界例如:空格,回车,标点符号等,字符串开头,字符串结束
"""
# 匹配一个字符串是否是'howare,'并且要求w的后面(a的前面)是一个单词边界
re_str = r'how\b,are'
result = re.fullmatch(re_str,  'how,are')
print(result)
    1. ^ - 检测是否是字符开头
# 匹配两个数字字符的字符串,并且建设这个字符串时候是字符串开头

re_str = r'^how\b,are'
result = re.fullmatch(re_str,  'how,are')
print(result)
    1. $ - 检测是否是字符串的结尾
    1. \大写字母 - 对\小写字母功能的否定

a.\W - 匹配非数字,字母,下划线
b.\S - 匹配非空白字符
c.\D - 匹配非数字字符
d.\B - 检测是否是非单词边界

re_str = r'\W\S\D\Bb'
result = re.fullmatch(re_str,  '~ovb')
print(result)
    1. [字符集] - 匹配[]中任意的一个字符
a.取出字符集中的一个
[普通字符集]  -  匹配[]中任意的一个字符
例如:[abc],[ab\d]
b.用'-'表示范围
[字符1-字符2]  -  匹配编码值再字符1编码到字符2编码之间的任意一个字符(ord(字符1)
    1. 转义符号 - 将正则中有特殊意义或者特殊功能的符号,表示符号本身(让特殊意义消失)
      有歧义产生是使用''

a.在中括号外面
在特殊意义的符号前加''让其特殊意义消失
b.在中括号里面
单独的有特殊意义的符号,除了 '^' 在最前面,'-'在两个字符之间,让其他都不需要转义,特殊意义自动消失

re_str = r'[1-9]\d+\.\d\d'
print(re.fullmatch(re_str, '1910.45'))

regular

1.匹配次数

        • 匹配0次或者多次

r'abc' - 匹配一个字符串'bc'前有0个或者多个a
r'\d
' - 匹配一个字符串由0个或者多个任意数字字符组成

# 练习:写一个正则表达式能够匹配所有的小数
re_str = r'[1-9]\d*\.\d*\d'
result = re.fullmatch(re_str, '1.0')
print(result)
        • 匹配一次或者多次(至少一次)
          """
          r'\d+' - 数字出现一次或者多次
          r'[abc]+' - 匹配一个字符串有一个或者多个字符,每一个字符是abc中的一个
          """
    1. {}

{N} - 匹配N次, {3}匹配3次
{M,N} - 匹配M到N次
{M,} - 匹配至少M次
{,N} - 匹配最多N次

re_str = r's\d{3}'
result = re.fullmatch(re_str, 's123')
print(result)

======贪婪和非贪婪======

2. 贪婪和非贪婪

a.以上是贪婪匹配:匹配次数不确定的时候,尽可能多
b.非贪婪:

    1. ? - 匹配一次或者0次
    1. 在匹配次数不确定的符号后面加?

在匹配次数不确定的符号后面加?
*?
+?
{M,N}?
{M,}?
{,N}?

3.=====分之(选择)=====

分之符号 | - 相当于逻辑运算里面的or

正则1|正则2        -      先用正则1去匹配如果匹配成功就成功,匹配不成功在使用正则2去匹配
                          (字符串能和正则1,正则2中任意一个匹配成功就成功)


r'\d{6,12}|[A-Za-z]{6,12}'

4.=====分组:()=====

a.将小括号里面的内容作为一个整体操作
b.\数字   --    重复第几个分组匹配结果(必须要有分组)

"""
# 用户名是7-13位,最后两位必须是aa或者bb或者cc
re_str = r'[a-zA-Z\d]{5,11}(aa|bb|cc)'

re模块

1.完全匹配 - 让字符串的长度和字符串的每个字符的值和正则表达式完全匹配

"""
re.fullmatch(正则表达式, 字符串) - 匹配成功返回匹配对象,返回失败返回None

当需要队整个字符串进行条件判断的时候使用:例如,检查账号是否合法,密码是否符合要求等

result = re.fullmatch(r'(\d{3})=([a-z]{3})', '234=asd')
print(result)
    1. span - 匹配到的内容在原字符串的位置
print(result.span())                # 整个正则表达式匹配结果的范围
print(result.span(1))               # 正则表达式中第一个分组匹配结果的范围
print(result.start(2), result.end(2))
  • 2)获取匹配到的值
print(result.group())               # 整个正则表达式匹配结果
print(result.group(1))              # 正则表达式中第一个分组匹配结果

3)获取原字符串

print(result.string)

2.匹配字符串开头

re.match(正则表达式, 字符串) - 判断字符串的开头是否和正则表达式相匹配.匹配成功返回匹配对象,匹配失败返回None

只检测字符串开头开头是否满足要求

result = re.match('\d{3}', '234456')
print(result)

3.search

re.search(正则表达式, 字符串) - 在字符串中查找哦是否有和正则表达式匹配的子串,
如果没有返回None,如果有就返回第一个匹配结果

method
result = re.search(r'(\d{3})=([a-z]{3})', 'how 234=abced842=abc===')
print(result, result.span(1), result.group(1))


## 4.findall

re.findall(正则表达式,字符串)  -  获取字符串中所有满足正则表达式的子串,以列表的形式返回

注意: 正则表达式中有分组的时候
没有分组 - 整个正则表达式匹配的结果作为列表元素(列表元素是字符串)
有一个分组 - 这个分组匹配到的结果作为列表元素(列表元素是字符串)
两个以上分组 - 这个分组匹配到的结果作为列表元素(列表元素是元祖,几个分组,元祖有几个元素)
```python
result = re.findall(r'(\d+)([a-z])', 'are sda46ada456sd465ds564')
print(result)

5.finditer

re.finditer(正则表达式,字符串) - 获取字符串中所有能够和正则表达式匹配的子串的匹配结果.
返回值是一个迭代器,迭代器中的元素是匹配结果

result = re.finditer(r'abc(\d|[A-Z]{2})', 'abc4-abcHD===')
print(list(result))
for item in result:
    print(item.group())
    print(item.group(1))
# 练习:计算一个字符值所有数字的和
# re 89he ks90.2 ans78oo1.23h!w9end9009ooo
re_str = r're 89he ks90.2 ans78oo1.23h!w9end9009ooo'
result = re.findall(r'(\d+\.?\d*)', re_str)
print(result)
n = 0
for item in result:
    n += float(item)
print(n)

** 短路操作 | 写在前面的会先匹配,匹配成功不会管后面的**

6.split

re.split(正则表达式,字符串) - 将字符串按照满足正则表达式的子串进行切割

result = re.split(r'[=/+-]', 'aaa+hhh-jjj/kkk')
print(result)

7.sub

re.sub(正则表达式,新字符串,字符串,替换次数) - 将字符串中满足正则表达式的子串替换成新字符串

替换次数不赋值,表示全部替换

result = re.sub(r'\d+', '=', 'das45ad12das46s21')
print(result)

你可能感兴趣的:(day18 - regular正则表达式)