python正则表达式

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配

函数语法:

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

参数说明:

参数 描述
pattern 匹配的正则表达式
string 要匹配的字符串
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

 

 

 

 

 

匹配成功re.search方法返回一个匹配的对象,否则返回None。

正则匹配常用通配符

(1)字符串"\d"匹配0~9之间的一个数值

实例:

import re
reg = r'\d'
a = re.search(reg,'adc1234dfg')
print(a)
print(a.group())

输出:

<re.Match object; span=(3, 4), match='1'>
1

(2)字符"+"重复前面一个匹配字符一次或者多次

实例:

import re
reg = r'\d+'
a = re.search(reg,'adc1234dfg')
print(a)
print(a.group())

输出:

<re.Match object; span=(3, 7), match='1234'>
1234

(3)字符"*"重复前面一个匹配字符零次或者多次

实例:

复制代码
import re
reg1 = r'ab+'
reg2 = r'ab*'
a = re.search(reg1,'adcabbd')
b = re.search(reg2,'adcabbd')
print(a)
print(a.group())
print(b)
print(b.group())
复制代码

输出:

<re.Match object; span=(3, 6), match='abb'>
使用正则表达式'ab+'匹配的结果为:abb
<re.Match object; span=(0, 1), match='a'>
使用正则表达式'ab*'匹配的结果为:a

与字符"+"的区别:

可见r'ab+'匹配的是'abb',而'ab*'匹配的是'a',这是由于'+'需要求'b'字符出现1次或多次,而'*'要求'b'字符出现0次或多次

(4)字符"?"重复前面一个匹配字符零次或者一次

实例:

import re
reg1 = r'ab?'
a = re.search(reg1,'abbbcd')
print(a)
print(f"使用正则表达式'ab?'匹配的结果为:{a.group()}")

输出:

<re.Match object; span=(0, 2), match='ab'>
使用正则表达式'ab?'匹配的结果为:ab
#匹配结果"ab”,虽然字符串中'b'重复了3次,但是'?'表示匹配字符零次或者一次

(5)字符"."匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符

实例:

复制代码
import re
reg1 = r'ab.'
a = re.search(reg1,'abcbcd')
print(a)

b = re.search(reg1,'ab\nbcd')
print(b)

c = re.search(reg1,'ab\nbcd',re.DOTALL)
print(c)
复制代码

输出:

<re.Match object; span=(0, 3), match='abc'>
None
<re.Match object; span=(0, 3), match='ab\n'>

可见未使用re.DOTALL时不能匹配\n换行符

(6)"|"代表把左右分成两个部分

实例:

import re
reg1 = r'ab|ba'
a = re.search(reg1,'abcbcd')
print(a)

b = re.search(reg1,'acbacd')
print(b)

输出:

<re.Match object; span=(0, 2), match='ab'>
<re.Match object; span=(2, 4), match='ba'>

可见匹配'ab'与'ba'都可以

(7)特殊字符使用反斜杠"“引导,例如”\r"、"\n"、"\t"、"\"分别表示回车、换行、制表符号与反斜线自己本身

实例:

import re
reg1 = r'a\nb'
a = re.search(reg1,'a\nbc')
print(a)

输出:

<re.Match object; span=(0, 3), match='a\nb'>

(8)字符"\b"匹配一个单词边界,也就是指单词和空格间的位置

实例:

import re
reg1 = r'th\b'
reg2 = r'on\b'
a = re.search(reg1,'python')
print(a)

b = re.search(reg2,'python')
print(b)

输出:

None
<re.Match object; span=(4, 6), match='on'>

可见'th'不是"python"字符串的结尾,而'on'才是结尾字符串

(9)"[]"中的字符是任选择一个,如果字符ASCll码中连续的一组,那么可以使用"-"字符连接,例如[0-9]表示0-9的其中一个数字,[A-Z]表示A-Z的其中一个大写字符,[0-9A-z]表示0-9的其中一个数字或者A-z的其中一个大写字符

实例:

import re
reg1 = r'[0-9]+'
a = re.search(reg1,"'Donovan's number is 1234567890")
print(a)
print(a.group())

输出:

<re.Match object; span=(21, 32), match='1234567890'>
1234567890

结合前面的知识,动动小脑筋,这里还有没有其它方法匹配出电话号码?

(10)"^"出现在[]的第一个字符位置,就代表取反,例如[ ^ab0-9]表示不是a、b,也不是0-9的数字

注意:这里所说的是出现在"[]"中

实例:

import re
reg1 = r'c[^ab0-9]t'
a = re.search(reg1,"catc1tcrt")
print(a)
print(a.group())

输出:

<re.Match object; span=(6, 9), match='crt'>
crt

(11)"^"匹配字符串的开头,例如"^ab"表示匹配以"ab"开头的字符串

注意:这里所说的是非出现在"[]"中

实例:

import re
reg1 = '^ab'
a = re.search(reg1,"cab")
b = re.search(reg1,"abc")
print(a)
print(b)

输出:

None
<re.Match object; span=(0, 2), match='ab'>

(12)"\s"匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]

实例:

import re
reg1 = 'a\sb'
a = re.search(reg1,"a bcd")
b = re.search(reg1,"acb")
print(a)
print(b)

输出:

<re.Match object; span=(0, 3), match='a b'>
None

 (13)"\S"匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

实例:

import re
reg1 = 'a\Sb'
a = re.search(reg1,"a bcd")
b = re.search(reg1,"acb")
print(a)
print(b)

输出:

None
<re.Match object; span=(0, 3), match='acb'>

(14)"$"字符比配字符串的结尾位置

实例:匹配以"ab"结尾的字符串

import re
reg1 = r'ab$'
a = re.search(reg1,"abcdac")
b = re.search(reg1,"abcdab")
print(a)
print(b)

输出:

None
<re.Match object; span=(4, 6), match='ab'>

(15)"\w"匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]

实例:

import re
reg1 = r'\w+'
a = re.search(reg1,"python_is 666")
print(a)
print(a.group())

输出:

<re.Match object; span=(0, 9), match='python_is'>
python_is

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none

函数语法与参数与search类似

re.match与re.search的区别

re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。

实例:

import re

s= 'abcdefg' 
a = re.match(r'cd',s)
print(a)
b = re.search(r'cd',s)
print(b)

输出:

None
<re.Match object; span=(2, 4), match='cd'>

re.finall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

注意:match 和 search 是匹配一次 findall 匹配所有。

语法:

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

实例:

import re

result1 = re.findall(r'\d+', 'runoob 123 google 456')
result2 = re.search(r'\d+', 'runoob 123 google 456')
print(result1)
print(result2.group())

输出:

['123', '456']
123

re.sub

Python的re模块提供了re.sub用于替换字符串中的匹配项。

语法:

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

参数:

参数 描述
pattern 正则中的模块字符串
repl 替换的字符串,也可为一个函数
string 要被查找替换的原始字符串
count 模式匹配后替换的最大次数 默认0表示替换所有匹配
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

 

 

 

 

 

 

 

实例:

复制代码
import re
 
phone = "2004-959-559 # 这是一个电话号码"
 
# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)
 
# 移除非数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)
复制代码

输出:

电话号码 :  2004-959-559 
电话号码 :  2004959559

扩展:

(1)\1....\9:匹配第n个分组的内容

import re

s = '2017-11-27'
print(re.sub('(\d{4})-(\d{2})-(\d{2})',r'\2-\3-\1', s))

输出:

11-27-2017

(2)

posted @   Ghost--Rider  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示