首页 > 编程语言 >Python正则表达式

Python正则表达式

时间:2023-02-05 18:32:28浏览次数:37  
标签:search group re Python 正则表达式 字符串 print 匹配

一、正则表达式

正则:用来匹配字符串的一门表达式语言

1.正则支持普通字符

2.元字符(一个字符来匹配一堆内容)

\d 能够匹配一个数字(0-9) \w 能够匹配数字、字母、下划线(0-9, a-z, A-Z, _) \W 除了数字、字母、下划线以外的内容 \D 除了数字以外的内容 [abc] 匹配a, b, c [^abc] 除了a, b, c的内容 . 除了换行符以外的其他所有内容都可以被匹配

3.量词(控制前面元字符出现的频次)

+表示前面的元字符出现1次或多次 *表示前面的元字符出现0次或多次,贪婪匹配的,尽可能多的拿到数据 ?表示前面的元字符出现0次或1次 [\u4e00-\u9fa5] 表示匹配中文字符

4.惰性匹配(爬虫重点)

image.png

二、Python内置模块re

import re
result1 = re.findall(r"\d+","山有木兮1木有枝99") #拿到的是列表
result2 = re.search(r"\d+","山有木兮1木有枝99") #只拿到第一个结果就返回
result3 = re.finditer(r"\d+","山有木兮1木有枝99") #把所有的结果放再迭代器里
for item in result3:
  print(item.group()) # 从match对象中拿到数据,需要group()
#预加载
obj = re.compile(r"\d+")
result4 = obj.findall("山有木兮1木有枝99")

#爬虫的应用
s="""
<div class="abc">
  <div><a rel="nofollow" href="baidu.com">我是百度</a></div>
  <div><a rel="nofollow" href="qq.com">我是腾讯</a></div>
  <div><a rel="nofollow" href="163.com">我是网易</a></div>
</div>
"""
obj=re.compile(r'<div><a rel="nofollow" href="(?P<url>.*?)">(?P<txt>.*?)</a></div>')
result=obj.finditer(s)
for item in result:
  url=item.group('url')
  txt=item.group('txt')
  print(url,txt)
  print(item.groupdict()) #输出入下图所示

image.png

三、Python中flags编译标志位

Python中flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,对多行数据进行匹配等。常用的flags如下: image.png (1)re.I 使匹配对大小写不敏感,如下:

# re.I 的学习,忽略大小写
S1 = 'CoN'   #定义字符串i1
S2 = 'www.xiao.con'    #定义字符串i2
#print(re.search('CoN','www.xiao.con').group())  #区分大小写的子组输出,报有错
print(re.search(S1,S2,re.I).group())  #不区分大小写的子组输出

结果: 输出 con 备注:输出字符的大小以被匹配的字符串的大小写为主,如S2为’www.xiao.CON’,则输出的为:CON (2)re.M 使用^ 和 $ 符号,实现多行多行匹配。如将所有行的末尾字符串输出得:

# re.M 的学习,将所有行的尾字母或者首部输出
S3 = '''I am girl
        you are boy
        we are friends
        '''                   #定义初始字符串
print(re.findall(r"\w+$",S3,re.M))   #输出S3的每行最后一个字符串
#  输出为:['girl','boy','friends']

(3)re.S匹配包括换行在内的所有字符。如下:

s1 = '''jduedhhelloworld:   
        11630
        passgrthgdg
        '''                     #初始字符串,有换行所以用三引号
b = re.findall('hello(.*?)pass',s1)   #findal返回字符串中某个正则表达式模式全部的非重复出现的情况,不包含换行,返回列表
c = re.findall('hello(.*?)pass',s1,re.S)  #包含换行
print('b is',b)  #输出B匹配的结果 #输出结果:b is []
print('c is',c)   #输出C,包行匹配输出的结果 #输出结果:c is ['world:   \n        11630\n        ']

总结:flags 编译标志位就相当于一些特殊的指令,就如上面提的比如是否忽略大小写。并不是必须使用,不用的时候定义flags=0即可。

四、Python中re.group()

正则表达式中,group()用来提出分组截获的字符串,()用来分组,既然()有如此的功能,我们在正则表达式中匹配‘(’和‘)’,要用‘\’对其转义

正则表达式中的三组括号把匹配结果分成三组

  • group() 同group(0)就是匹配正则表达式整体结果
  • group(1) 列出第一个括号匹配部分
  • group(2) 列出第二个括号匹配部分
  • group(3) 列出第三个括号匹配部分。
  • groups() 表示从group(1)开始往后的所有值,组合成一个元组类型的值
  • group() 表示取全部匹配的字符串或者指定的组,返回结果是一个字符串
import re
a = "123abc456"
# 没有匹配成功的,re.search()返回None
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) # 123abc456,返回整体
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) # 123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) # abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) # 456
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).groups()) # ('123', 'abc', '456')
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group())  # 123abc456

五、例子

1.读取txt文件中的中文

# -*- coding:utf-8 -*-
import sys
import re

with open('./text.txt', 'r',encoding = "utf-8") as f:
    temp=f.readlines()
    title="".join(re.findall(r'[a-zA-Z0-9\u4E00-\u9FA5]+',temp[0]))
    content=""
    for i in temp[1:]:
        content+="".join(re.findall(r'[\u4E00-\u9FA5]+',i))

if __name__=="__main__":
    print(title,content,sep='\n')          

标签:search,group,re,Python,正则表达式,字符串,print,匹配
From: https://blog.51cto.com/u_15944471/6038326

相关文章

  • 【Python学习004】Pythonic代码风格(一)
    Pythonic代码风格(一)大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!命名命名的核心目的在......
  • 用GPU来运行Python代码
    简介前几天捣鼓了一下Ubuntu,正是想用一下我旧电脑上的N卡,可以用GPU来跑代码,体验一下多核的快乐。还好我这破电脑也是支持Cuda的:$sudolshw-Cdisplay*-display......
  • 【python装饰器:参数,顺序,场景】
    一、装饰器是什么?装饰器,顾名思义,就是增强函数或类的功能的一个函数。作用:在不修改功能代码的同时,给代码扩展新的功能,可以装饰函数,也可以装饰类。举个例子:如何计算函数的执......
  • python-conftest、fixture、matefunc介绍
    pytest的规则使用"""使用pytest编写用例,必须遵守以下规则:(1)测试文件名必须以“test_”开头或者"_test"结尾(如:test_ab.py)(2)测试类命名以"Test"开头。(3......
  • python接口自动化-logging日志
    logging模块的日志级别:日志级别一共有5个从低到高如下,作用是在当你给python函数赋予日志器时,需要自己标记日志级别(后面会用到)DEBUG(调试级别):严重程度最低级别,详细程度最......
  • 10 正则表达式应用
    name-date.txt在文档最后所有文件为:  1、使用正则表达式将如下文字中合法的邮件地址输出。“工作邮箱是:[email protected],生活中经常使用邮箱[email protected],个人邮箱:P......
  • RBMQ中python案例一:简单模式
    一、生产者与消费者模式之简单模式,原理图   二、生产者产生消息importjsonimportpikaimportdatetime#生产者producer.pydefget_message():#......
  • python-pytest.ini介绍
    一、pytest.ini执行方式含义[pytest]addopts=-vsq--html=./report.htmltestpaths=./testConftestpython_files=test*.pypython_classes=Test*python_func......
  • Mac-pycharm执行python3 manage.py makemigrations报错处理
    Mac-pycharm执行python3manage.pymakemigrations报错处理1报错:NameError:name'_mysql'isnotdefined参考:https://blog.csdn.net/weixin_35757704/article/detail......
  • Python黑客编程之tcp代理
    目的写一款socket代理工具,其实就是在原来两极通信中再加一极,中间极用来转发socket的流量,可以在中间层面实现流量的拦截和篡改代码代理importsocketimportsysim......