当前位置:   article > 正文

Python3正则表达式_python3正则匹配

python3正则匹配

说明:

        在python中,先是正则基本理论和字符代表意思,接着是python3中re的实操正则模块

目录

理论:

一、元字符

二、限定符

三、字符类

四、排除字符

五、选择字符

六、转义字符

七、分组 

八、小知识点

Python3正则操作

一、匹配字符串

1、使用 match()方法匹配

常用标志

2、使用 search()方法匹配

3、使用findall()方法进行匹配

 4、sub()替换字符

5、使用正则表达式分割字符串

贪婪与非贪婪搜索


理论:

一、元字符

常用元字符及说明

元字符说明元字符说明
.匹配除换行以外的任意字符\b 匹配单词的开始或结束
\w 匹配字母或数字或下划线或汉字\w+表示不限长度的数字,字母和下划线(其他的添加+号效果一致)
\W除了数字,字母下划线字符和[A-Za-z0-9]以外的其他字符^匹配字符串开头
\s匹配任意的空白符,定位,Tab键,换行,换页字符$匹配字符串结尾
\S除了匹配任意的空白符,定位,Tab键,换行,换页字符以外的其他字符+匹配前面的字符一次或多次
\d匹配数字,0~9的整数字元\D除了0~9的整数字以外的其他字符
  1. # 举例
  2. \bgao\w*\b

解析: 
     匹配以字母gao开头的单词,先匹配单词开始处(\b),然后匹配字母gao,接着匹配任意数量的数字或字母(\w*(*代表任意多个字符)),最后匹配单词结束处(\b)
    该表达式 可以匹配如“gao123”、“gaoqwe”等

二、限定符

常用限定符以及对应的说明和举例

限定符 说明举例
匹配前面的字符零次或一次colou?r  # 该表达式可以匹配clour和color
+匹配前面的字符一次或多次go+gle # 该表达式可以匹配的范围从gogle到go任意到gle结尾
*匹配前面的字符零次或多次go*gle # 该表达式可以匹配从go任意到gle结尾
.匹配单一字符.at #代表只匹配at加上前面任意一个字母
.*匹配所有字符。搜索0到多个通配符(换行字符除外).* #表示搜索所有字符".*"的组合应用
{n}匹配前面的字符n次   go{2}gle  # 该表达式只匹配google
{n,}匹配前面的字符最少n次go{2,}gle # 该表达式可以匹配goo...gle或google
{n,m}匹配前面的字符最少n次,最多m次employe{0,2} # 该表达式可以匹配 employ 、employe、employee 
|        代表或

三、字符类

        如果要匹配没有预定义元字符的集合(如元音字母 a、e、i、o),那么只需要在括号里列出它们即可,例如[aeio]匹配任何一个英文元音字母,而 [.?!] 表示匹配标点符号“.” “?” “!”,也可以指定范围例如[0-9]代表的含义与\d一致 

字符分类含义
[a-z]代表 a~z 之间所有字母的小写
[A-Z]代表 A~Z 之间所有字母的大写
[aeiouAEIOU]代表英文发音的元音字符
[2-5]代表2~5之间的数字 包含2和5

四、排除字符

        正则表达式中"^" 表示行的开始,但是加入到方括号中就是排除的意思

  1. # 例如
  2. [^a-zA-Z]
  3. #匹配字母开头,不区大小写字母

五、选择字符

        例如 匹配身份证号码  (身份证号码规则: 身份证号码长度为18位,前17位为数字后一位是校验位,该校验位可能为 X或x, 这里可以用 “|”(或) 来实现 

 (^\d{18}$)|(^\d{17})(\d|X|x)$

上述表达式为: 可以匹配身份证的 18位号码 或 17位号码和最后一位字母为大小写X

六、转义字符

        正则表达式中转义字符为“\” 反斜杠 ,符号溢出不识别可以加“\” 转义

  1. # 例如
  2. #匹配ip地址的写法 
  3. [1-9]{1,3}\.[0-9]{1.3}.........等

七、分组 

小括号 分组 也叫 子表达式

  1. # 举例
  2. (thir|four)th

上述表示 匹配单词 thirth 或 fourth 

、小知识点

        python之执行过程中出现出现特殊字符需要通过 “\” 来转义一下 让python识别到,所以正则表达式中需要用这种方法书写: \\d\\d    也可以通过在前面加上 r 来防止字符溢出,例如 r'\d\d'

Python3正则操作

使用re模块来实现表达式的操作

简介:

        re模块用于实现正则表达式的操作,在实现是可以使用re模块提供的方法(如 search  match  findall等)进行字符串处理,可以使用compile方法将模式字符串转换为正则表达式对象,再使用该表达式相关方法操作

一、匹配字符串

         匹配字符串 用re模块下的 match、search、findall等方法

1、使用 match()方法匹配

        match方法用于字符串开始处进行匹配,如果在起始位置匹配成功,返回Match对象,否则返回None

语法格式:

re.match(pattern,string,[flages])

 # 参数说明

        pattern: 表示模式字符串,由要匹配的正则表达式转换而来

        string:表示要匹配的字符串

        flags:可选参数,表示标志位,用于控制匹配方式,如 是否区分字母大小写(参数请查看上述的“常用标志”一栏)

常用标志

标志说明
A或ASCII对于\w,\W,\b,\B,\d,\D,\s,\S只进行ASCII匹配(使用3.x)
I或IGNORECASE执行不区分字母大小写匹配
M或MULTILINE将^和$用于包括整个字符串的开始和结尾的每一行(默认情况下,仅适合用于字符串的开始和结尾处)
S或DOTALL使用“.”字符匹配所有字符,包括换行符
X或VERBOSE 忽略模式字符串中未转义的空格和注释
方法说明
group()可回传搜索到的字符串
end()可回传搜寻到的字符串的结束位置
start()可回传搜索到的字符串起始位置
span()可回传搜索到的字符串的(起始,结束)位置

正则表达式可以包含一些可选标志修饰符来控制匹配的模式

修饰符        说明
re.I忽略大小写
re.L表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M多行模式
re.S即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X为了增加可读性,忽略空格和 # 后面的注释

#举例:   可以将字符串中匹配的结果拿出来

  1. import re
  2. # 匹配例子
  3. pattern = r'This_\w+' # 模式字符串 \w : 匹配字母或数字或下划线或汉字 "+" 代表 匹配前面的字符一次或多次
  4. string = 'This_is_my_dog THIS_IS_MY_DOG' # 要匹配的字符
  5. match = re.match(pattern, string, re.I) # 匹配字符串不区分大小写 注意 I 大写
  6. print(f"直接输出结果:{match}") # 输出
  7. print(f'匹配值的起始位置:{match.start()}')
  8. print(f'匹配结束位置:{match.end()}')
  9. print(f'匹配位置的元组:{match.span()}')
  10. print(f'要匹配的字符串:{match.string}')
  11. print(f'匹配的数据:{match.group()}')
  12. # 不匹配例子 不到的结果返回为None
  13. strings = 'haha THIS_IS_MY_DOG'
  14. matchs = re.match(pattern, strings, re.I) # 与上面同理
  15. print(f"不匹配的结果:{matchs}")

运行结果:

 # 解析: 

        re.match方法从字符串开始位置匹配,当第一个字母不符合条件时,不在匹配,直接返回None

        当re.natch方法匹配到后悔显示匹配字符的下标位置以及匹配内容,注意 这里只能返回第一个匹配到的值,第二个不会返回

2、使用 search()方法匹配

# 注意 :

         re.search 可以匹配字符串中任意一个地方的关键词  与 match的区别在于 match值匹配开头的第一个,而search可以匹配任意位置

        search 如果找不到对比相符的字符串会传回None的值,如果找到会传回对应的值

格式:

re.search(pattern,string,[flages])

参数说明:

        pattern: 表示模式字符串,由要匹配的正则表达式转换而来

        string:表示要匹配的字符串

        flags:可选参数,表示标志位,用于控制匹配方式,如 是否区分字母大小写(参数请查看上述的“常用标志”一栏)

# 举例

  1. import re
  2. string = r'(黑客)|(抓包)|(偷)|(盗)|(监听)' # 模式字符串 匹配其中内容 “|”代表或
  3. strings = "我想学习关于黑客方面的知识,并查阅黑客的书籍!"
  4. match = re.search(string, strings) # re.search 可以匹配字符串中任意一个地方的关键词
  5. print(match)
  6. if match == None:
  7. print(f"{strings} #安全!")
  8. else:
  9. print(f"{strings} #有危险词汇!")

 # 运行结果:

多个分组的通道搜索

        如果想要搜索字符串对比内容中的任意一个字符串组合,可以使用以下表达式的格式

pattern = 'test(one|two|three)'

案例:

  1. import re
  2. strings = "testonetwothree"
  3. pattern = r'test(one|two|three)'
  4. txt = re.search(pattern, strings)
  5. print(txt.group())
  6. print(txt.group(1)) # 只能匹配其中一个结果 多个也只能匹配一个 匹配最后一个

# 运行结果

使用groups()函数配合search 函数

        使用search函数提取字符的时候,可以使用 groups 这个方法取得分组内容

例如:

  1. import re
  2. # 将a中的数字匹配出来 并利用 groups 进行分组提取
  3. a = "This is my phone 123-456789"
  4. pattern = r"(\d{3})-(\d{6})"
  5. b = re.search(pattern, a)
  6. print(b)
  7. d, c = b.groups()
  8. print(d)
  9. print(c)

# 运行结果

3、使用findall()方法进行匹配

         findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回匹配结构的列表,否则返回空列表

格式:

re.findall(pattern,string,[flages])

参数说明:

        pattern: 表示模式字符串,由要匹配的正则表达式转换而来

        string:表示要匹配的字符串

        flags:可选参数,表示标志位,用于控制匹配方式,如 是否区分字母大小写(参数请查看上述的“常用标志”一栏

  1. import re
  2. # 匹配例子
  3. pattern = r'This_\w+' # 模式字符串 \w : 匹配字母或数字或下划线或汉字 "+" 代表 匹配前面的字符一次或多次
  4. string = 'This_is_my_dog THIS_IS_MY_DOG' # 要匹配的字符
  5. match = re.findall(pattern, string, re.I) # 匹配字符串不区分大小写 注意 I 大写
  6. print(match)

 # 运行结果:

 4、sub()替换字符

sub 方法用于实现字符串的替换

格式:

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

# 参数说明

        pattern:  表示模式字符串,由要匹配的正则表达式转换而来。

        repl: 表示替换得字符串。

        string: 表示要被查找替换的原始字符。

        count:可选参数,表示模式匹配后替换的最大次数,默认为0次,表示替换所有的匹配内容。

        flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写(参数请查看上述的“常用标志”一栏

举例:

  1. import re
  2. string = r'(黑客)|(抓包)|(偷)|(盗)|(监听)' # 模式字符串 匹配其中内容 “|”代表或
  3. strings = "我想学习关于黑客方面的知识,并查阅黑客的书籍!"
  4. match = re.sub(string,'(违规言语!)', strings) # re.search 可以匹配字符串中任意一个地方的关键词
  5. print(match)

  运行结果:

     

5、使用正则表达式分割字符串

        spli 方法用于实现根据正则表达式切割字符,并以列表的形式返回。

格式:

re.split(pattern,string,[maxsplit],[flags])

参数说明

        pattern:表示模式字符串,由要匹配的正则表达式转换而来。

        string: 表示要匹配的字符

        maxsplit: 可选参数,表示最大的拆分次数。

        可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写(参数请查看上述的“常用标志”一栏

举例:

        截出一个正确的网址

  1. import re
  2. pattern = r'[?]' # 定义分隔符
  3. url = "https://www.bdqn.vip/?cat=7"
  4. result = re.split(pattern, url) # 分割字符串
  5. print(result)

运行结果:

        

贪婪与非贪婪搜索

        我们都知道大括号的作用,当\d{4}代表重复4次,也就是大括号的数字设定的重复次数,那么(son){3,5}代表所搜说的字符串如果是 'sonsonson','sonsonson','sonsonsonsonson'都是符合条件的,也就是说字符串重复3~5次都算搜索成功

 案例:

  1. def strings(pattern, msg):
  2. txt = re.search(pattern, msg)
  3. if txt == None: # 如果搜索不到返回值为None
  4. print("搜索成功", txt)
  5. else: # 反之搜索成功
  6. print("搜索成功", txt.group())
  7. pattern = r'(son){3,5}' # 匹配 "son" 3到8次
  8. msg1 = "son"
  9. msg2 = "sonson"
  10. msg3 = "sonsonson"
  11. msg4 = "sonsonsonson"
  12. msg5 = "sonsonsonsonson"
  13. strings(pattern=pattern, msg=msg1)
  14. strings(pattern=pattern, msg=msg2)
  15. strings(pattern=pattern, msg=msg3)
  16. strings(pattern=pattern, msg=msg4)
  17. strings(pattern=pattern, msg=msg5)

# 运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/172155
推荐阅读
相关标签
  

闽ICP备14008679号