1 正则表达式


  • .:匹配任意单个字符
  • x:匹配任意指定字符
  • \:匹配一个反斜杠
  • \n:匹配一个换行符
  • \s:匹配空白的字符
  • \d:匹配一个数字
  • \D:匹配一个非数字
  • \w:匹配一个字母或数字或下划线
  • [abc]:匹配字母a、b、c
  • [^abc]:匹配除字母a、b、c以外的任何字符
  • [a-zA-Z]:匹配所有字母
  • [0-9]:匹配所有数字
  • [a-zA-Z_0-9]:匹配所有字母和下划线和数字
  • ^[a-z]: ^代表行的开头,以字母开头
  • [0-9]$:代表行的结尾,以数字结尾
  • [abc]?:?匹配的是一个字母或者没有字母
  • \d*:匹配多个数字或者没有数字
  • \d+:+匹配多个数字
  • \d{n}:匹配前一个字符连续n次
  • \d{n,}:匹配前一个字符连续至少n次
  • \d{n,m}:匹配前一个字符连续至少n次,最多m次

2 re模块


1 findall

  • 匹配多个字符,返回列表
  • 用法:re.findall(pattern,string)
    1. Str = 'abc123def456ghi'
    2. ret = re.findall(r'\d+', Str)
    3. for data in ret:
    4. print(data)

    2 大小写不敏感设置


  • 用法:re.xx(flags=re.IGNORECASE)
    1. Str = 'AbC123DeF456GhJ'
    2. ret = re.findall('[a-z]', Str, flags=re.IGNORECASE)
    3. print(ret)

    3 search


  • 匹配从左到右的第一个字符
  • 用法:re.search(pattern,string).group()

    1. Str = 'abc123def456ghi'
    2. ret = re.search(r'\D+', Str)
    3. print(ret.group())

    4 从头开始匹配

  • 相当于search正则表达式中加上^

  • 用法:re.match(pattern,string).group()
  • 类似字符串的startswith

    1. Str = 'abc123def456ghi'
    2. ret = re.match('[a-z]+', Str)
    3. print(ret.group())
    4. print(ret.start())
    5. print(ret.end())

    5 切割字符

  • 用法:re.split(pattern,string)

    1. Str = 'abc123def456ghi'
    2. ret = re.split(r'\d+', Str)
    3. print(ret)

    6 替换字符

  • 用法:re.sub(pattern,replace,string,count)

    1. Str = 'abc123def456ghi'
    2. ret = re.sub(r'\d+', '|', Str)
    3. print(ret)

    7 替换字符并返回替换次数,返回元组

  • 用法:re.subn(pattern,replace,string,count)

    1. Str = 'abc123def456ghi'
    2. ret = re.subn(r'\d+', '|', Str)
    3. print(ret[0], ret[1])

    8 编译式正则

  • 优点:处理重复数据时节省时间

  • 用法:re.compile(pattern)

    1. Str = 'abc123def456ghi'
    2. ret = re.subn(r'\d+', '|', Str)
    3. print(ret[0], ret[1])

    9 迭代器

  • 优点:处理大量数据时节省空间与内存

  • 用法:re.finditer(pattern,string)

    1. Str = 'abc123def456ghi'
    2. ret = re.finditer(r'\d+', Str)
    3. for data in ret:
    4. print(data.group())

    10 非贪婪模式

  • 使用通配符会尽量取最长满足字符串,加上?可取最短满足字符串

  • 用法:?、*、+之后

    1. Str = 'abc123def'
    2. ret = re.search(r'abc\d+', Str)
    3. ret2 = re.search(r'abc\d+?', Str)
    4. print(ret.group())
    5. print(ret2.group())

    11 分组的使用

  • 用法:(pattern) ```python Str = ‘https://www.baidu.com‘ ret = re.search(r’(\w+)://(\w+).(\w+).(\w+)’, Str) print(ret.group()) print(ret.group(1)) print(ret.group(2)) print(ret.group(3)) print(ret.group(4))

Str = ‘https://www.baidu.com‘ ret = re.findall(r’(\w+)’, Str) print(ret)

  1. <a name="mdqfe"></a>
  2. ## 12 分组命名
  3. - 用法:(?<name>Ppattern)
  4. ```python
  5. Str = '123//123'
  6. ret = re.search(r'(?P<con>\w+)//(?P=con)', Str)
  7. print(ret.group())

3 实战


1 取标签中文本内容

Str = r"""

岗位职责:
完成推荐算法、数据统计、接口、后台等服务器端相关工作

必备要求:
良好的自我驱动力和职业素养,工作积极主动、结果导向

技术要求:
1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式
2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架
3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种
4、掌握NoSQL、MQ,熟练使用对应技术解决方案
5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js

加分项:
大数据,数理统计,机器学习,sklearn,高性能,大并发。"""

1 显示所有符合文本,贪婪模式下取最长的<匹配字符

ret = re.findall('>.*<', Str)
print(ret)

2 显示所有符合文本,非贪婪模式

ret = re.findall('>.*?<', Str)
print(ret)

3 只显示括号内的文本

ret2 = re.findall('>(.*?)<', Str)
print(ret2)

2 取各网址的域名

Str = """https://blog.csdn.net/
https://www.baidu.com/s?wd=123
https://www.yuque.com/weicreate/base
https://www.sogou.com/web?query=321"""

ret = re.findall(r'https://(.*?)/', Str)
print(ret)

3 将邮箱格式分离并替换成自己的邮箱地址

Str = """1243007569@qq.com, weicreate@163.com, whp@sina.com
whp123@139.com, whp123@134.com
wuhao321@123.com"""

ret = re.compile(r'[^,\n].?@?.com')
res = ret.findall(Str)
res2 = ret.sub('weicreate@qq.com', Str)
print(res)
print(res2)

参考文件


re模块.py