正则表达式的核心教程

1. 什么是正则表达式?

正则表达式:按照一定的规则,从某个字符串中匹配出想要的数据,这个规则就是正则表达式。

2. 正则表达式字符匹配规则

(1) (字符串)匹配任意字符串

text = 'hello'
ret = re.match('he',text)
print(ret.group())
>> he

(2) (.)匹配单个字符,但是不能匹配不到换行符。

text = "ab"
ret = re.match('.',text)
print(ret.group())
>> a

(3) (\d)匹配任意一个数字 && (\D)匹配任意一个非数字

# \d
text = "123"
ret = re.match('\d',text)
print(ret.group())
>> 1

# \D
text = "a"
ret = re.match('\D',text)
print(ret.group())
>> a

(4) (\s)匹配空白字符,包括所谓的\n,\t,\r以及空格等空白符

text = "\t"
ret = re.match('\s',text)
print(ret.group())
>> 空白

(5) (\w)匹配a-z或0-9或_  &&  (\W)则相反

\w
text = "_"
ret = re.match('\w',text)
print(ret.group())
>> _

\W
text = "+"
ret = re.match('\W',text)
print(ret.group())
>> +

(6) [ ]表示组合的意思,只要满足[ ]中的某一项即可匹配成功

text = "0731-88888888"
ret = re.match('[\d\-]+',text)
print(ret.group())
>> 0731-88888888

(7) .  +  *  { } 等 限定符 用来匹配多个字符

(7.1) *限定符

*:可以匹配0或者任意多个字符

 text = "0731"
 ret = re.match('\d*',text)
 print(ret.group())
 >> 0731

(7.2) +限定符

+:可以匹配1个或者多个字符,最少一个。

 text = "abc"
 ret = re.match('\w+',text)
 print(ret.group())
 >> abc

(7.3) *限定符

?:匹配的字符可以出现一次或者不出现(0或者1)。

 text = "123"
 ret = re.match('\d?',text)
 print(ret.group())
 >> 1

(7.4) { }限定符的用法

{m}:匹配m个字符。

{m,n}:匹配m-n个字符,在这中间的字符都可以匹配到。

 text = "123"
 ret = re.match('\d{1,2}',text)
 prit(ret.group())
 >> 12

(8) ^ 表示以什么什么开始 (注意:如果是在中括号中,那么代表的是取反操作。并且match函数默认使用^,只能从头部匹配)

text = "hello"
ret = re.match('^h',text)
print(ret.group())

(9) $ 表示以什么什么结束

text = "xxx@163.com"
ret = re.search('\w+@163\.com$',text)
print(ret.group())
>> xxx@163.com

(10) | 匹配多个表达式或者字符串,可当 “或” 来理解

text = "world helloo"
ret = re.search(r'hello|world',text)
print(ret.group())
>> hello

3. re(正则表达式)模块中常用的函数

(1) match:从字符串开始的位置进行匹配。

从开始的位置进行匹配。如果开始的位置没有匹配到。就直接失败了。示例代码如下:
text = 'hello'
ret = re.match('h',text)
print(ret.group())
>> h
如果第一个字母不是h,那么就会失败。示例代码如下:
text = 'ahello'
ret = re.match('h',text)
print(ret.group())
>> AttributeError: 'NoneType' object has no attribute 'group'
如果想要匹配换行的数据,那么就要传入一个flag=re.DOTALL,就可以匹配换行符了。示例代码如下:
text = "abc\nabc"
ret = re.match('abc.*abc',text,re.DOTALL)
print(ret.group())

(2) search:从整个字符串任意位置进行匹配。

在字符串中找满足条件的字符。如果找到,就返回。说白了,就是只会找到第一个满足条件的。
text = 'apple price $99 orange price $88'
ret = re.search('\d+',text)
print(ret.group())
>> 99

(3) findall: 找出所有满足条件的,返回的是一个列表。

找出所有满足条件的,返回的是一个列表。
text = 'apple price $99 orange price $88'
ret = re.findall('\d+',text)
print(ret)
>> ['99', '88']

(4) finditer:返回的是一个可迭代对象,可进行遍历

import re
for i in re.finditer('[1-3]+[^b-z]?','1a13a'): ###finditer用来迭代列表
        print(i)
        print(i.group())
>>
>>   <_sre.SRE_Match object; span=(0, 2), match='1a'>
>>   1a
>>   <_sre.SRE_Match object; span=(2, 5), match='13a'>
>>   13a

(5) sub:替换字符串,将匹配到的字符串替换为其他字符串。

text = 'apple price $99 orange price $88'
ret = re.sub('\d+','0',text)
print(ret)
>> apple price $0 orange price $0

(6) split:使用正则表达式来分割字符串。

text = "hello world ni hao"
ret = re.split('\W',text)
print(ret)
>> ["hello","world","ni","hao"]

(7) complie:用来构造正则表达式对象(当某个正则表达式要重复使用时,可大大节省效率)

#对象使用方式
reobject = re.compile(r'[7-9]{3}')
list = reobject.findall('1234567893214698742238883339991211')
print(list)
print(list[0])
>> ['789', '987', '888', '999']
>> 789

---------------------------------------------------------------------------------------------------------------------------

【重要补充】

1. group取值的用法

在正则表达式中,可以对过滤到的字符串进行分组。分组使用圆括号的方式,即一个圆括号及其里面的内容表示一个分组。

  1. group():和group(0)是等价的,和分组无关(也就是正则中括起来的),返回的是整个 满足正则表达式的字符串。
  2. group(1):返回的是第一个子分组。
  3. groups():这个等价于(group(1), group(2), ...group(n)),是所有分组的所构成的一个元组tuple。

2. 原生字符串 和 转义字符

在正则表达式中,有些字符是有特殊意义的字符。因此如果想要匹配这些字符,那么就必须使用反斜杠进行转义。比如$代表的是以...结尾,如果想要匹配$,那么就必须使用\$。示例代码如下:

text = "apple price is \$99,orange paice is $88"
ret = re.search('\$(\d+)',text)
print(ret.group())
>> $99

原生字符串:
在正则表达式中,\是专门用来做转义的。在Python中\也是用来做转义的。因此如果想要在普通的字符串中匹配出\,那么要给出四个\。示例代码如下:

text = "apple \c"
ret = re.search('\\\\c',text)
print(ret.group())

因此要使用原生字符串就可以解决这个问题:

text = "apple \c"
ret = re.search(r'\\c',text)
print(ret.group())

那么原理是什么呢?为什么在不适用r来标记原生字符串的时候需要四个\呢?使用r的时候需要两个\呢?

我们需要先来了解一下正则表达式的一个匹配过程,例如 ret = re.search('\\\\c',text) 这句代码:我们都知道 \ 字符无论是在python中还是正则表达式中都表示转移字符,这句代码 首先python将其解释成 \\c(第一个和第三个\分别表示转义,那么第二个和第四个表示普通字符\,最终即成为了\\c),接下来正则表达式拿到\\c后第一个\表示转义,因此将最后解释为普通的 \c 两个字符,再去匹配的文本里比较。而使用r来标记原生字符串后,python默认解释其为\\c三个字符,最后交由正则表达式再经过转义后即普通的\c两个字符。 

原生字符串这里比较绕,希望对大家有所帮助,也欢迎大家讨论给出指导~!

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值