人工智能(regex)—— 正则表达式

本文介绍了正则表达式的基础知识,包括元字符、贪婪与非贪婪模式、分组概念及re模块的使用方法。适合初学者快速掌握正则表达式的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、正则表达式

正则表达式产生原因:
        1. 文本处理已经成为计算机常见工作之一
        2. 对文本内容的搜索、定位、提取是一项比较复杂困难的工作
        3. 为了快速方便处理上述问题,产生正则表达式技术

定义:
        即高级文本匹配模式,提供了搜索、替代、查找等功能。本质是由一系列特殊符号和字符组成的子串,这个子串即是正则表达式。这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。

目标:
        1. 熟练使用正则表达式符号
        2. 正确组合和理解一般的正则表达式
        3. 能够使用Python操作正则表达式

正则表达式特点
        * 方便进行检索和修改文本的操作
        * 支持语言众多
        * 灵活多样
        * mongo正则类型,django等框架作为url匹配,爬虫

正则表达式的使用
        Python ----》 re模块 处理正则表达式

        re.findall(pattern,string)
                功能:使用正则表达式匹配字符串
                参数:pattern 正则表达式
                            string  目标字符串
                返回值:一个列表  匹配到的所有内容

二、元字符

        即正则表达式中有特殊含义的符号

元字符总结
        匹配单个字符:a  .  \d  \D   \w  \W  \s  \S  [...]  [^...]
        匹配重复性 : *   +   ?  {N}  {m,n}
        匹配某个位置 : ^   $   \A  \Z   \b  \B
        其他 :  |   ()  \

名字字符匹配规则示例结果
普通字符a   b   c   &   #匹配相应的普通字符re.findall("abc","abcdefghabcdhig")['abc', 'abc']
|

匹配|两边任意一个正则表达式符合的情况

注: |两侧不要有没用的空格

re.findall("ab|cd","abcdefghabcdhig")['ab', 'cd', 'ab', 'cd']
匹配单一字符.匹配除了换行(\n)之外的任意字符re.findall("f.o","foo is not fao")['foo', 'fao']
匹配开始位置^匹配一个字符串的开始位置re.findall("^hello","hello world")['hello']
匹配结束位置$匹配目标字符串的结束位置re.findall("py$","hello.py")['py']
匹配起止位置\A(^) \Z($)\A匹配开始位置    \Z匹配结束位置re.findall("\A/\w+/\w+\Z",'/football/zhongchao')['/football/zhongchao']
匹配重复*匹配前面的正则表达式重复0次或多次re.findall("ab*","abbcdef")['abb']
匹配重复+匹配前面的正则表达式重复1次或多次re.findall(".+py$","hello.py")['hello.py']
匹配重复匹配前面的正则表达式重复0次或1次re.findall("ab?","abcdefa")['ab', 'a']
匹配重复{n}匹配指定的重复次数re.findall("ab{3}","abbbbbbbb")['abbb']
匹配重复{m,n}匹配前面的正则表达式重复m次到n次re.findall("ab{2,5}","abcdabbbabbbbbb")['abbb', 'abbbbb']
匹配字符集合[]

匹配括号范围内的任意一个字符

[abc123d]  a b c 1 2 3 d
[a-z]  
[A-Z]
[0-9]
[123a-zA-Z]

re.findall("[_0-9a-zA-Z]","Hello world 123") 
匹配字符集合[^...]匹配除了字符集中的任意一个字符re.findall('[^abce]+',"a little boy")[' littl', ' ', 'oy']
匹配任意(非)数字字符\d     \D

\d 匹配任意数字字符:[0-9]

\D 匹配任意非数字字符:[^0-9]

re.findall("1\d{10}","17611665537")['17611665537']
匹配(非)普通字符\w     \W

普通字符: 数字、字母、下划线

\w 匹配任意一个普通字符:[_0-9a-zA-Z]

\W匹配任意非普通字符:[^_0-9a-zA-Z]

re.findall("\w+","hello$1")

 

re.findall("\W+","hello$1")

['hello', '1']

 

['$']

匹配(非)空字符\s     \S

空字符:空格 \r \t \n \0

\s 匹配任意空字符

\S 匹配任意非空字符

re.findall("\s",'hello world\r\n\t\0')[' ', '\r', '\n', '\t']
匹配(非)单词边界位置\b     \B

单词边界:数字字母下划线和其他字符的交界位置为单词的边界

\b 匹配单词的边界

\B匹配非单词的边界

re.findall(r"\Bis\b",'This is a test')['is']

三、转义字符

        正则表达式特殊符号 :
                .   *   ?   $  ''   ""   []  {}  ()   \  ^
        如果想匹配特殊符号则加转义
                eg:\"\.\"   ----->  "."

名字字符含义示例结果
转移r

raw 

原生字符串 : 不进行转义

re.findall(r"\bis",'This is')

re.findall('ok\?','Are your ok?')

['is']

['ok?']

四、贪婪和非贪婪

正则表达式默认的重复匹配模式:贪婪模式
        尽可能多的向后匹配
        *  +   ?  {m,n}  这四种情况下会产生贪婪模式

非贪婪模式 : 尽可能少的匹配内容,满足正则表达式含义即可
        贪婪---》非贪婪   : *?   +?  ??  {m,n}?

示例结果
re.findall("ab*?",'abbbbbbbbcded')['a']
re.findall("ab+?",'abbbbbbbbcded')['ab']

五、正则表达式分组

        可以使用()为一个正则表达式建立子组,子组可以看做正则表达式的一个局部整体

子组的作用
        1. 增加子组后对正则表达式整体的匹配内容没有影响
        2. 子组可以改变重复元字符的重复行为
        3. 子组在某些操作中可以对子组匹配内容单独提取

子组的注意事项
        1.每个正则表达式可以有多个子组,由外到内由左到右为第一第二。。。。子组
        2.子组通常不要交叉

捕获组和非捕获组(命名组和非命名组)
子组命名格式
        (?P<name>pattern)

        eg:re.search(r'(?P<dog>ab)cdef','abcdefgh').group()

命名作用 :
        1.很多编程接口可以直接通过名字获取子组匹配内容
        2.捕获组中的正则表达式可以通过名字重复调用
        (?P=name)

正则表达式设计原则
        1. 正确性,能够正确的匹配要求内容
        2. 唯一性,除了需要匹配的内容,尽可能不匹配不需要    的内容
        3. 全面性,对目标特征考虑全面不遗漏

作用示例结果
重复re.search(r'(ab)+','ababababcdef').group()'abababab'
re.search(r'.+(\.com|\.cn)','abc@123.cn').group()'abc@123.cn'
提取re.search(r'(ab)+','ababababcdef').group(1)'ab'
 re.search(r'(?P<dog>ab)cdef','abcdefgh').group()'abcdef'
 re.search(r'(?P<dog>ab)cd(?P=dog)',"abcdab").group()'abcdab'

六、re模块

 

regex = re.compile(pattern,flags = 0)
        功能:生成正则表达式对象
        参数:pattern  正则表达式
                    flags   功能标志位,丰富正则的匹配功能
        返回值: 正则表达式对象

list = re.findall(pattern,string,flags)
        功能 : 根据正则表达式匹配目标字符串
        参数 : pattern 正则表达式
                        string 目标字符串
        返回 : 返回一个列表,内部为匹配到的内容

        * 如果正则表达式有分组则只显示子组内容
                                    
list = regex.findall(string,pos=0,endpos=999)
        功能 : 根据正则表达式匹配目标字符串
        参数 : string 目标字符串
                        pos 标明从目标字符串的哪个位置开始匹配
                        endpos 标明匹配到目标字符串的哪里

        返回 : 返回一个列表,内部为匹配到的内容

re.split(pattern,string,flags=0)
        功能 : 通过正则表达式分隔字符串
        参数 : pattern  正则
                        string   目标字符串
        返回值 : 分割后字符串列表

re.sub(pattern,replaceStr,string,max,flags)
        功能: 替换正则表达式匹配到的内容
        参数: pattern  正则
                     replaceStr  要替换的内容
                     string  目标字符串
                     max  最多替换几处
        返回值 : 返回替换后的字符串


re.subn(pattern,replaceStr,string,max,flags)
        功能: 替换正则表达式匹配到的内容
        参数: pattern  正则
                     replaceStr  要替换的内容
                     string  目标字符串
                     max  最多替换几处
        返回值 : 返回替换后的字符串和替换了几处


re.finditer(pattern,string,flags)
        功能 : 使用正则表达式匹配目标字符串
        参数: pattern  正则
                     string  目标字符串
        返回值 : 将匹配内容生成迭代器
     
re.fullmatch(pattern,string,flags)
        功能 : 完全匹配目标字符串
        参数: pattern  正则
                     string  目标字符串
        返回值 : 匹配到的内容 (match object)

obj = re.match(pattern,string,flags)
        功能 : 匹配目标字符串开头
        参数: pattern  正则
                     string  目标字符串
        返回值 : 匹配到的内容 (match object)

obj = re.search(pattern,string,flags)
        功能 : 匹配目标字符串,只能匹配第一处
        参数: pattern  正则
                     string  目标字符串
        返回值 : 匹配到的内容 (match object)

        * 生成match对象如果失败会返回None ,则无法调用match对象属性,此时会产生异常。


compile生成的正则对象属性
        pattern   正则对象对应的正则表达式
        flags     获取标志位值
        groupindex  获取捕获组形成的字典 组名为键,第几组为值
        groups    多少子组

七、附录:目录

        人工智能(regex)—— 目录汇总

 

正则表达式自动生成器是一个智能、易用的正则表达式生成、测试以及字符串提取工具。正则表达式库让你可以直接借用正则表达式,而无需自己费脑筋。“正则表达式自动生成器”可以自动生成正则表达式,测试正则表达式,可视化显示结果,导出提取字符串,你所要做的,仅仅是几下鼠标点击! 正则表达式自动生成器主要功能: 自动生成正则表达式 编辑并测试正则表达式 多向导页,可在多个源文本上测试同一个正则表达式(标准版无此功能) 多页参考生成正则表达式(标准版无此功能) 自动检查和修改生成的正则表达式的正确性 以可视方式呈现测试结果 从文本文件中获取源文本 从HTML页面中获取源代码 一键导出匹配文本 一键导出提取字符组,并按自定义的分隔符进行分隔 保存项目以便重复测试和修改 在“设计元素”中学习并创建正则表达式 直接从正则表达式库中选择利用正则表达式 多语种 100%-200%大字体下完美显示 你可以从任何纯文本中提取有规律的文字,比如txt文件,XML文件,csv文件,HTML文件等,然后导出到剪贴板或文本文件中,你可以很方便地把它们导入到程序,数据库,excel文件等。 正则表达式自动生成器现在有三个语言版本: 英语,简体中文,繁体中文,我们会在以后加入其他语言,比如日语,德语和法语等。 正则表达式自动生成器更新内容: 1、修复一些小bug。 2、增加自定义组和限定词的正则表达式 3、增加自定义窗口背景 4、增加自定义按钮背景 5、修改软件时间为UTC时间(日志除外) 6、修改更新模块 正则表达式自动生成器截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值