python14--re模块(正则表达式)

2020-08-04  本文已影响0人  minisummer

哈喽,大家好!我是minisummer!首先感谢您的关注!
今天给大家分享的内容是python标准库-re模块。

在讲re模块之前,首先我们需要知道正则表达式的基本语法。

正则表达式

正则表达式是一个特殊的字符序列,能方便的检查一个字符串是否与某种模式匹配。re模块使得python拥有全部的正则表达式功能。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。
正则表达式在线工具:http://tool.chinaz.com/regex/

正则表达式作用

1.做数据校验;
2.替换文本;
3.提取子字符串;
4.查找特定文本。

正则表达式特殊字符

. 匹配除换行符\n之外的任何单字符
? 匹配0或1个字符(非贪婪限定符)
* 匹配0或多个字符(贪婪限定符)
+ 匹配1或多个(贪婪限定符)
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
[] 匹配包含在中括号中的任意字符
[^] 匹配包含在中括号中的字符之外的字符
[-] 匹配指定范围的任意单个字符
{ 标记限定符表达式的开始
\ 将下一个字符标记特殊字符或原义字符
| 指明两项之间的一个选择
() 标记一个子表达式的开始和结束位置

正则表达式限定符

. 匹配除换行符\n之外的任何单字符
+ 匹配0或多个字符(贪婪限定符)
? = {0,1}匹配0或1个字符(非贪婪限定符)
{n} 确定匹配n次
{n,} 至少匹配n次
{n,m} 最少匹配n次且最多匹配m次

正则表达式字符簇

[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何空白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

常用的正则表达式

[a-z] #匹配所有的小写字母
[A-Z] #匹配所有的大写字母
[a-zA-Z] #匹配所有的字母
[0-9] #匹配所有的数字
[0-9.-] #匹配所有的数字,句号和减号
[ \f\r\t\n] #匹配所有的白字符
[^a-z] #除了小写字母以外的所有字符
[^\/^] #除了()(/)(^)之外的所有字符
[^"'] #除了双引号(")和单引号(')之外的所有字符
^[a-zA-Z_]#所有的字母和下划线 ^[[:alpha:]]{3} #所有的3个字母的单词
^a#字母a ^a{4} #aaaa
^a{2,4}#aa,aaa或aaaa ^a{1,3} #a,aa或aaa
^a{2,}#包含多于两个a的字符串 ^[a-zA-Z0-9_]{1,} # 所有包含一个以上的字母、数字或下划线的字符串
^[1-9][0-9]{0,}# 所有的正整数 ^\-{0,1}[0-9]{1,} # 所有的整数
^[-]?[0-9]+.?[0-9]+$ # 所有的浮点数

re模块

import re

re_str = "hello this is python 2.7.13 and python 3.4.5"
pattern1 = "python [0-9]\.[0-9]\.[0-9]"
res1 = re.findall(pattern=pattern1,string=re_str)
print(res1) #['python 2.7.1', 'python 3.4.5']

pattern2 = "python [0-9]\.[0-9]\.[0-9]{2,}"
res2 = re.findall(pattern=pattern2,string=re_str)
print(res2) #['python 2.7.13']

# findall()方法:返回一个列表,如果匹配到的话,列表中的元素为匹配到的子字符串,如果没有匹配到,则返回一个空的列表
pattern3 = "python[0-9]\.[0-9]\.[0-9]{2,}"
res3 = re.findall(pattern=pattern3,string=re_str)
print(res3) #[]


re_str = "hello this is python 2.7.13 and Python 3.4.5"
pattern4 = "python [0-9]\.[0-9]\.[0-9]"
# 设置标志flags=re.IGNORECASE,意思为忽略大小写
res4 = re.findall(pattern=pattern4, string=re_str, flags=re.IGNORECASE)
print(res4) # ['python 2.7.1', 'Python 3.4.5']


# 一般采用编译的方式使用python的正则模块,如果在大量的数据量中,编译的方式使用正则性能会提高很多
re_str = "hello this is python 2.7.13 and Python 3.4.5"
re_obj = re.compile(pattern = "python [0-9]\.[0-9]\.[0-9]",flags=re.IGNORECASE)
res = re_obj.findall(re_str)
print(res) #['python 2.7.1', 'Python 3.4.5']


# match方法,类似于字符串中的startwith方法,只是match应用在正则表达式中更加强大,更富有表现力,match函数用以匹配字符串的开始部分,如果模式
# 匹配成功,返回一个SRE_Match类型的对象,如果模式匹配失败,则返回一个None,因此对于普通的前缀匹配,他的用法几乎和startwith一模一样,例如我们要判断data字符串是否以what和是否以数字开头
s_true = "what is a boy"
s_false = "What is a boy"
re_obj = re.compile("what")
print(re_obj.match(string=s_true))  #<re.Match object; span=(0, 4), match='what'>
print(re_obj.match(string=s_false)) #None


# search方法,模式匹配成功后,也会返回一个SRE_Match对象,search方法和match的方法区别在于match只能从头开始匹配,而search可以从
# 字符串的任意位置开始匹配,他们的共同点是,如果匹配成功,返回一个SRE_Match对象,如果匹配失败,返回一个None,这里还要注意,
# search仅仅查找第一次匹配,也就是说一个字符串中包含多个模式的匹配,也只会返回第一个匹配的结果,如果要返回所有的结果,最简单的方法就是findall方法,也可以使用finditer方法


# finditer返回一个迭代器,遍历迭代器可以得到一个SRE_Match对象
re_str = "what is a different between python 2.7.14 and python 3.5.4"
re_obj = re.compile("\d{1,}\.\d{1,}\.\d{1,}")
for i in re_obj.finditer(re_str):
    print(i) #<re.Match object; span=(35, 41), match='2.7.14'> ; <re.Match object; span=(53, 58), match='3.5.4'>

# re模块sub方法类似于字符串中的replace方法,只是sub方法支持使用正则表达式,所以,re模块的sub方法使用场景更加广泛
re_str = "what is a different between python 2.7.14 and python 3.5.4"
re_obj = re.compile("\d{1,}\.\d{1,}\.\d{1,}")
print(re_obj.sub("a.b.c", re_str, count=1)) #what is a different between python a.b.c and python 3.5.4
print(re_obj.sub("a.b.c",re_str,count=2))#what is a different between python a.b.c and python a.b.c
print(re_obj.sub("a.b.c",re_str))#what is a different between python a.b.c and python a.b.c


# re模块的split方法和python字符串中的split方法功能是一样的,都是将一个字符串拆分成子字符串的列表,区别在于re模块的split方法能够
re_str = "what is a different between python 2.7.14 and python 3.5.4 USA:NewYork!Zidan.FRA"
# 使用. 空格 : !分割字符串,返回的是一个列表
re_obj = re.compile("[. :!]")
print(re_obj.split(re_str)) #['what', 'is', 'a', 'different', 'between', 'python', '2', '7', '14', 'and', 'python', '3', '5', '4', 'USA', 'NewYork', 'Zidan', 'FRA']

# 大小写不敏感设置
# re.compile(flags=re.IGNORECASE)


# 非贪婪匹配
s = "Beautiful is better than ugly.Explicit is better than impliciy."
re_obj = re.compile("Beautiful.*y\.")
print(re_obj.findall(s))#['Beautiful is better than ugly.Explicit is better than impliciy.']
re_obj = re.compile("Beautiful.*?\.")
print(re_obj.findall(s)) #['Beautiful is better than ugly.']

s = "=aa1239d&&& 0a ()--"
rep = re.compile("\w+(&+)")
print(rep.findall(s))# ['&&&']
print(rep.search(s).group())# aa1239d&&&
print(rep.search(s).group(1))# &&&

参考文章:https://www.cnblogs.com/bainianminguo/p/10657631.html

请大家多多指教~
以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。
注:转载请注明出处,商用请征得作者本人同意,谢谢!!!

上一篇下一篇

猜你喜欢

热点阅读