文章目录
前言
正则表达式,只要是从事IT工作的同学都不会陌生,网络等基础类的IT从业人员会将正则表达式用于,例如在Voice方向的IP电话时,会用正则表达式匹配拨号规则。像一些日志服务器会有正则表达式来匹配相应的字符串等等。
正则表达式可以包含特殊字符或者普通字符,普通字符就是我们常见的大写字母,小写字母,数字等。在简单的正则表达式中,它仅仅匹配这些字符本身。也可以使用高级匹配模式。
正常表达式字符及相应的意义(核心概念)
匹配字符 | 意义 |
---|---|
. | 匹配任意单个字符 |
^ | 锚定行首,其后跟一个字符串表示匹配以该字符串开头的行 |
$ | 锚定行尾,其前跟一个字符串表示匹配以该字符串结尾的行 |
* | 默认工作在贪婪模式下,匹配其前的字符可以出现任意次 |
+ | 匹配其前的字符至少出现一次,就是[1,∞) |
? | 默认工作在贪婪模式下,匹配其前的字符可有可无,换句话说,其前的字符可以是0次或者1次 |
*?,+?,?? | 这是前3种模式的非贪婪模式的匹配方式。 |
{m,n} | 默认工作在贪婪模式下,匹配其前的字符至少出现m次,至多出现n次。 |
{m,n}? | 上面匹配方式的非贪婪模式 |
\ | 逃逸符,即去掉某些字符的特殊意义,或者指定某些字符具有特殊意义 |
[] | 匹配中括号内出现的单个字符,注意,括号内的“,”都是可以匹配的字符,无特殊意义,例如[a,b]是3个字符,而不是两个字符,另外“-,^,\”这3个具有特殊意义。 |
[^] | 如果在中括号内前面加个托字符表示匹配中括号内出现的字符外的单个字符 |
" | " |
(…) | 将小括号内的字符当成一个整体来匹配 |
“\” 逃逸符组成的特定字符串
使用“\”组成的特定的序列,并且字符是从下面的组合。
如果这个普通的字符不在这个列表中,正则表达式将匹配第二个字符。
匹配字符 | 意义 |
---|---|
\number | 匹配组内为相同数字的内容 |
\A | 仅匹配以该字符串开始内容 |
\Z | 仅匹配以该字符串结尾的内容 |
\b | 匹配空字符串(匹配特殊字符串的边界),但是仅仅是在单词的词首或者词尾 |
\B | 匹配空字符串,但不是在单词的词首或者词尾 |
\d | 匹配十进制数字,相当于"[0-9]" |
\D | 匹配非数字的字符,相当于“[^\d]” |
\s | 匹配任意空白字符,相当于“[ \t\n\r\f\v]” |
\S | 匹配任意非空白字符,相当于“[^\s]” |
\w | 匹配所有字母跟数字,相当于“[a-zA-Z0-9_]” |
\W | 匹配“\w”的补集,相当于[^\w] |
\ | 匹配“\”本身 |
关于python的语法解释器与re模块语法解释器的冲突情况
python需要依靠python解释器对语法进行语法分析,词法分析,而在python中又impot了re模块,这种情况下,对于一些特殊字符的意义会有相应的冲突。例如“\”对于两种解释器都有特殊的意义,所以需要提前了解释的顺序跟过程。又例如“\b”在ASCII中表示退格键,而在python中,"\b"是一个正则表达式的符号,用于表述特殊字符的边界。所以,想让正则表达式将“\b”表达成字符的边界而不是退格键,所以需要多加一个“\”来表示转义,即“\b”。
上述方法可以说是通过解释器一层层的传递进入到re模块的,但是这种方法较为复杂,还得“算一算”,正则表达式一复杂就更为麻烦了,在正则表达式之前,使用"r"表示python并不去解析特定字符串的意义,而是将看到的任何字符当成普通字符。换句话说,python不在将看到的特殊字符当成特殊字符来处理了。
re正则表达式的各类方法
方法 | 意义 |
---|---|
re.findall() | 从左往右依次进行查找,查找出所有符合条件的项,返回值为列表。,但是使用findall来匹配字符串的时候,如果使用了()对字符进行了分组,则findall会将匹配的分组的内容匹配出来。,可加一个“?:“可以取消这个分组的优先级 |
re.search() | 从左往右查找,查找到即终止,即只查看第到一个,后续有相同的内容不返回,返回值为一个对象,并非找到的值 |
re.search().group() | 可将对象中的值进行返回。在search时,可以使用(?Pregular expression)定义一个组,然后可以使用.group(“gorup-name”)来调用,只显示相应组名所匹配到的内容,具体可以查看示例 |
re.match() | 只在字符串开始匹配,如果字符在中间则不符合,也只返回一个对象,对象可以调用group()返回结果 |
re.split(pattern,string,maxsplit=0,flags=0) | 分割字符串,以指定的正则表达式内容来分割字符串。[a,b]此方法表示先以a来分成若干个段,再以b将a他的若干的段再次分。 |
re.sub(pattern,repl,string,count,…) | 最少需要3个参数,正则匹配,被替换的内容,字符串,所以与replace的方法很相似,count参数表示替换前几次匹配到的内容。 |
re.subn(pattern,repl,string,count,…) | 与sub方法一样,只不过在返回的对象内会告诉你替换了几次 |
re.finditer() | 返回的是一个迭代器,将匹配到的内容全部放到迭代器内,可以使用for循环遍历,也可以使用next()取出来 |
re.compile(pattern,flags=0) | 主要用于将字符串形式的正则表达式编译为pattern对象。第二个参数flag是匹配模式,聚会可以使用按位或者运算符“ |
示例
re.search()
import re
Tesla = re.search("Elon","Elon Musk is the CEO of the SpaceX")
print(Tesla)
"""
<re.Match object; span=(0, 4), match='Elon'> 返回值为一个对象,并非相应的值
"""
re.search().group()
import re
Tesla = re.search("Elon","Elon Musk is the CEO of the SpaceX")
print(Tesla)
print(Tesla.group())
"""
<re.Match object; span=(0, 4), match='Elon'>
Elon
"""
re.search(?Pregular expression)
import re
Tesla = re.search("(?P<CEO>Elon)","Elon Musk is the CEO of the SpaceX")
print(Tesla)
print(Tesla.group("CEO"))
"""
<re.Match object; span=(0, 4), match='Elon'>
Elon
"""