正则表达式笔记——带实例一看就会

 

Python中re模块中的match方法:

字符

单字符匹配

.

匹配任意字符(除了\n)

[...]

匹配字符集

\d \D

匹配任意数字,匹配任意非数字

\s \S

匹配空白字符,匹配非空白字符

\w \W

匹配单词字符[a-zA-Z0-9],匹配任意非单词字符

举例:

  • 匹配大括号中及其有一个字符的字符串:{a}

{.}

  • 匹配大括号中及其中有字符集 z1s 的任意一个字符:{z}

{[z1s]}

  • 匹配大括号中及其中有字符集 a-zA-Z0-9的任意一个字符:{n}

{[a-zA-Z0-9]},又可写成:{[\w]}

  • 匹配中括号及该中括号内存在一个单词字符:[a]

\[[\w]\],需要加转义符号(这里贴个图,被转义了)

 

字符

多字符匹配

*

匹配前一个字符0次或者无限次

+

匹配前一个字符1次或者无限次

匹配前一个字符0次或者1次

{m} {m,n}

匹配前一个字符m次,匹配前一个字符m-n次

*? +? ??

匹配模式变为非贪婪(尽可能减少匹配字符,即分别匹配0、1、0次)

举例:

  • 匹配一个字符串开头是大写字母,后面跟着 >=0 个小写字母:Zhangfeng

[A-Z][a-z]*

  • 匹配一个Python变量名是否有效(开头可以是_和字母,不可以是数字)

[_a-zA-Z]+[_\w]*

  • 匹配0-99中任意数字,其中 01-09 该形式不对

[1-9]?[0-9],该写法匹配 05 形式时,结果是0,[1-9]? 表示1-9可以出现0-1次, 而09前面没有出现1-9,再匹配第二个[0-9],便匹配上了0;即[1-9]?[0-9]可匹配的字符串大小是1-2(python中match方法是从头开始匹配,匹配到开头那个是符合正则表达式,则给出正确的返回值)

  • 匹配@前面有6-9个字符的qq邮箱

[a-zA-Z0-9]{6,9}@qq.com

  • 用正则表达式 [0-9][a-z]* 匹配字符串 3bc 时,结果为3bc

用正则表达式 [0-9][a-z]*? 匹配字符串 3bc 时,结果为3

用正则表达式 [0-9][a-z]+? 匹配字符串 3bc 时,结果为3b

用正则表达式 [0-9][a-z]?? 匹配字符串 3bc 时,结果为3

 

字符

边界匹配

^

匹配字符串开头

$

匹配字符串结尾

\A \Z

指定的字符串必须出现在开头,/结尾

举例:

  • 匹配正确的邮箱格式:@前面有6-9个字符

^[\w]{6,9}@qq.com$,上述匹配@前面有6-9个字符的qq邮箱正则表达式 [a-zA-Z0-9]{6,9}@qq.com,匹配字符串 1236545@qq.comabc 时,亦可得到结果:1236545@qq.com

  • 匹配以字符串 imooc 开头的字符串

\Aimooc[\w]*

 

字符

分组匹配

|

匹配左右任意一个表达式

(a,b)

括号中表达式作为一个分组

\<number>

引用编号为number的分组匹配到的字符串

(?P<name>)

分组起一个别名

(?P=name)

引用别名为name的分组匹配字符串

举例:

  • 匹配 0-99 或者 100:

[0-9]?\d$|100

  • 匹配@前有6-9个字符的 qq邮箱 或者 gmail 邮箱 或者 163邮箱:

[\w]{6,9}@(qq|163|gmail).com

  • 匹配XML格式,如有:<book>python</book>

<[\w]+>,匹配<book>,结果:<book>

<([\w]+>),匹配<book>,结果:< book>,其中 <([\w]+>)\0 为:<, <([\w]+>)\1 为:book>

<([\w]+>)\1,匹配<book>book>,结果为:<book>book>,

<([\w]+>)[\w]+</\1 或者写成 <(?P<mark>[\w]+>)[\w]+</(?P=mark),匹配<book>python</book>,结果:<book>python</book>

 

Python其他方法:

# search(pattern, string, flags=0)
# 在一个字符串中查找匹配

# 查找字符串中的数字
str = "imooc videonum = 1000"
result = str.search(r'\d+', str) 
# result = '1000'


# findall(pattern, string, flags=0)
# 找到匹配,返回所有匹配部分的列表

# 查找字符串中的所有数字
str2 = "c++ = 100, java = 55, python = 80"
result = str.findall(r'\d+', str) 
# result = ['100', '55', '80']
# split(pattern, string, maxsplit=0, flags=0) :
# 根据匹配分割字符串,返回分割字符串组成的列表

# 拆分字符串str = "Imooc:C C++ Java Python, C#",成各门课程列表
str = "Imooc:C C++ Java Python, C#"
re.split(r':| |,', str)

# 返回结果:['Imooc', 'C', 'C++', 'Java', 'Python', 'C#']
# sub(pattern, repl, string, count=0, flags=0)
# 将字符串中匹配正则表达式的部分替换为其他值

# 使查找到的字符串其数字部分自动加1
def add(match):
    val = match.group()
    num = int(val) + 1
    return str(num)
 
 str = "imooc videonum = 999"
 re.sub(r'\d+', add, str) # re.sub    
 
# 返回结果: str = "imooc videonum = 1000"

 

转载请注明出处

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值