正则表达式

资源文件

RegexBuddy v4.5.0.rar

https://tool.oschina.net/regex/

正则表达式

正则表达式是一种特殊的字符串模式,用于匹配一组字符串。它最早出现于 20 世纪 40 年代,当时用来描述正则语言,而到 20 世纪 70 年代才真正出现在程序设计领域。

通用字符类型

原子字符
d匹配任意一个十进制数字,等价于[0-9]
D匹配任意一个除十进制数字以外的字符,等价于[^0-9]
s匹配任意一个空白字符,等价于[nr\v]
S匹配除空白字符以外任何一个字符,等价于[^nrlv]
w匹配任意一个数字、字母或下画线,等价于[0-9a-zA-Z」
W匹配除数字、字母或下画线以外的任意一个字符,等价于[^0-9a-zA-Z]

自定义原子表

#匹配  asp   psp   jsp
[apj]sp

元字符

元字符含义描述
*匹配0次、1次或多次其前的原子
+匹配1次或多次其前的原子
匹配0次或1次其前的原子
.匹配除了换行符外的任意一个字符
\ 匹配两个或多个分支选择
{n}表示其前面的原子恰好出现n次
{n,}表示其前面的原子出现不少于n次
{n,m}表示其前面的原子至少出现n次,最多出现m次
^或A匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符之后)
$或Z匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一换行符之前)
b匹配单词的边界
B匹配除单词边界以外的部分
[]匹配方括号中指定的任意一个原子
[^]匹配除方括号中的原子以外的任意一个字符
()匹配其整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子

匹配案例

707-827-7019
458-898-4587
124-456-1021
\d{3,4}[-.]?

re库

Re库的主要功能函数

re.search(pattern,string,flags=0)

  • 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象

re.match(pattern,string,flags=0)

  • 从一个字符串的开始位置起匹配正则表达式,返回match对象

re.findall(pattern,string,flags=0)

  • 搜索字符串,以列表类型返回全部能匹配的子串

re.split(pattern,string,maxsplit=0,flags=0)

  • 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型

re.finditer(pattern,string,flags=0)

  • 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素式match对象

re.sub(pattern,repl,string,count=0,flags=0)

  • 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

常用标记

flags:正则表达式使用时的控制标记

re.I (re.IGNORECASE)忽略正则表达式的大小写,即使[A-Z]也能匹配小写字符
re.M (re.MULTILINE)正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S (re.DOTALL)使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。

match对象

  • 对象的属性
属性说明
.string待匹配的文本
.re匹配时使用的patter对象(正则表达式)
.pos正则表达式搜索文本的开始位置
.endpos正则表达式搜索文本的结束位置
  • 对象的方法
方法说明
.group(0)获取匹配后的字符串
.start()匹配字符串在原始字符串的开始位置
.end()匹配字符串在原始字符串的结束位置
.span()返回(.start(),.end)

课程案例

匹配My cat is brown staccato中的单词cat

import re

string = "My cat is brown staccato"

resu = re.findall(r'\bcat\b',string)

print(resu[0])

创建一个正则表达式,当把它重复应用到目标文本Mary, Jane, and Sue went to Mary's house之上时,会匹配到Mary、Jane、Sue,且能再次匹配到Mary。之后再进行的匹配尝试都会失败。

import re

string = "Mary, Jane, and Sue went to Mary's house"

resu = re.findall(r'Mary|Jane|Sue',string)

for i in resu:
    print(i)

创建一个正则表达式,使之匹配yyyy-mm-dd格式的任意日期,并且分别捕获年、月和日。目标是在处理匹配的代码中可以更容易处理这些分别捕获的值。你可以假设目标文本中的所有日期都是合法的。

import re

string = '''
    2013-12-08abcded2014-11-11mary
'''

resu = re.finditer(r'\d{4}-(\d{2})-(\d{2})',string)

for i in resu:
    print(i.group(0),"月:",i.group(1),"日:",i.group(2))

创建一个正则表达式来匹配按照yyyy-mm-dd格式的“神奇”日期。神奇日期指的是年份后2位与月份和该月的日期都是相同的数字。

import re

string = '''
    2013-12-08abcded2014-11-11mary2011-11-11
'''

resu = re.search(r'\d{2}(\d{2})-\1-\1',string)

print(resu.group(0))

匹配一对XHTML标签<p>和</p>,以及二者之间的所有文本。在标签之间的文本也可以包含其他XHTML标签。

<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>
import re

string = '''
<p>
The very <em>first</em> task is to find the beginning of a paragraph.
</p>
<p>
Then you have to find the end of the paragraph
</p>
'''

resu = re.search(r'<p>(.*?)</p>',string,flags = re.S)

print(resu.group(1))

课后练习

匹配手机号

编写一个正则表达式来进行手机号匹配,需要注意手机号是

  • 1开头,
  • 第二位是3、4、5、7、8的任意一位
  • 其他位是0-9的数字
13578941547abc124acbd789edx17589652314
  • 代码

    import re
    
    string = '''
    13578941547abc124acbd789edx17589652314
    '''
    
    resu = re.search(r'1[34578]\d{9}',string,flags = re.S)
    
    print(resu.group())

匹配十六进制颜色

编写一个正则表达式来匹配十六进制颜色

#ff0022cda#23acd%123#abcd4567#9988ab#FF89CC
  • 代码

    import re
    
    string = '''
    #ff0022cda#23acd%123#abcd4567#9988ab#FF89CC
    '''
    
    resu = re.findall(r'\#\w{6}',string)
    
    for i in resu:
        print(i)
    
最后修改:2024 年 06 月 01 日
如果觉得我的文章对你有用,请随意赞赏