Loading

正则表达式之re模块

TOC

re模块

在python中,若想使用正则表达式,必须通过re模块来实现

import re

一、什么是正则表达式与re模块?

正则表达式是一门独立的技术, 任何语言都可以使用正则表达式,
正则表达式是由一堆特殊的字符组合而来的。

1.1 字符组

  • 字符组:
    • [0-9] 可以匹配到一个0-9的字符
    • [9-0]: 报错, 必须从小到大
    • [a-z]: 从小写的a-z
    • [A-Z]: 从大写A-Z
    • [z-A]: 错误, 只能从小到大,根据ascii表来匹配大小。
    • [A-z]: 总大写的A到小写的z。

    注意: 顺序必须要按照ASCII码数值的顺序编写。

1.2 元字符

1.2.1 单个使用

1.2.2 组合使用

  • 组合使用
    • \w\W: 匹配字母数字下划线与非字母数字下划线,匹配所有。
    • \d\D: 无论是数字或者非数字都可以匹配。
    • \t: table
    • \n: 换行
    • \b: 匹配单词结尾,tank jasonk
    • ^: startswith
      • '^'在外面使用: 表示开头。
      • [^]: 表示取反的意思。
    • $: endswith
    • ^$: 配合使用叫做精准匹配,如何限制一个字符串的长度或者内容。
    • |: 或。ab|abc如果第一个条件成立,则abc不会执行,怎么解决,针对这种情况把长的写在前面就好了,一定要将长的放在前面。
    • [^...]: 表示取反的意思。
    • [^ab]: 代表只去ab以外的字符。
    • [^a-z]: 取a-z以外的字符。

二、为什么要使用正则

比如要获取“一堆字符串”中的“某些字符”,
正则表达式可以帮我们过滤,并提取出想要的字符数据。

  • 比如过滤并获取 “tank”
'wafawrjkwagfiu21knriut8ankjfdgau0q92ru20yrisana tank wyqfwqrqyr9q 9'
```python
import re
str1 = 'wafawrjkwagfiu21knriut8ankjfdgau0q92ru20yrisana tank wyqfwqrqyr9q 9'
res = re.findall('tank', str1)
print(res)
  • 应用场景:
    • 爬虫: re, BeautifulSoup4, Xpath, selector
    • 数据分析过滤数据: re, pandas, numpy...
    • 用户名与密码、手机认证:检测输入内容的合法性
    • 过滤关键字

三、如何使用

3.1 re模块的三种比较重要的方法

3.1.1 findall()

可以匹配 "所有字符" ,拿到返回的结果,返回的结果是一个列表。

import re
str1 = 'sean tank json'
# findall
res = re.findall('[a-z]{4}', str1)
print(res)

3.1.2 search()

在匹配一个字符成功后,拿到结果后结束,不往后匹配。

import re
str1 = 'sean tank json'
# search
res = re.search('[a-z]{4}', str1)
print(res)  # 返回的是一个对象
print(res.group())  # 从对象中取值


<re.Match object; span=(0, 4), match='sean'>
sean

3.1.3 match()

从匹配字符的开头匹配,若开头不是想要的内容,则返回None。

import re
str1 = 'sean tank json'
# match
res = re.match('sean', str1)
print(res)
print(res.group())


<re.Match object; span=(0, 4), match='sean'>
sean

# 如果没有匹配到则会返回None,然后打印的时候会出错
None
Traceback (most recent call last):
  File "G:/python项目/day17/re模块.py", line 11, in <module>
    print(res.group())
AttributeError: 'NoneType' object has no attribute 'group'
# 因此我们可以加一个if判断句,可以避免上面的问题
import re
str1 = 'sean tank json'
# match
res = re.match('12', str1)
print(res)

if res:
    print(res.group())

四、示例

4.1 检测手机号码的合法性

# 纯python校验
while True:
    phone_number = input('请输入手机号码:').strip()
    # not > and > or
    if len(phone_number) == 11 and (phone_number.startswith(
        '13'
    ) or phone_number.startswith(
        '14'
    ) or phone_number.startswith(
        '15'
    ) or phone_number.startswith(
        '19'
    )):
        print('手机号码合法!')
        break

    else:
        print('手机号码不合法!')

# re校验
import re
while True:
    phone_number = input('手机号:')
    if re.match('^(13|14|15|19)[0-9]{9}', phone_number):
        print('合法')
        break
    else:
        print('不合法')




posted @ 2019-11-19 18:49  开花的马铃薯  阅读(228)  评论(0)    收藏  举报