自学Python 49 正则表达式(一)基本语法表达

Python 正则表达式(一)基本语法表达

活动地址:CSDN21天学习挑战赛

今天继续学习Python,并且加入活动“CSDN21天学习挑战赛”,和小伙伴们一起学习啦!



  正则表达式又被称为规则表达式,英文名称是Regular Expression,在程序代码中经常被简与为Regex、Regexp、或RE。正则表达式是一种文本模式,包括普通字符(例如, a到z之间的字母)和特殊字符(称为元字符)。正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,将匹配的子串做替换,或着从某个串中取出符合某个条件的子串等。正则表达式是烦琐的,但它是强大的,学会之后的应用除了提高效率外,还会带来绝对的成就感。目前绝大多数开发语言都支持利用正则表达式进行字符串操作,例如C+、Java、 C#、PHP、Python等。


一、普通字符

  正则表达式是包含文本和特殊字符的字符串,该字符串描述了一个可以识别各种字符串的模式。普通字符包括没有显式指定为元字符的所有可打印和不可打印的字符,这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。例如下面所介绍的正则表达式都是最基本的、最普通的普通字符,它们仅仅用一个简单的字符串构造成一个匹配子符串的模式:该字符串由正则表达式定义。

正则表达式模式匹配的字符串
foofoo
PythonPython
studystudy

  在上表中, 第一个正则表达式模式是" foo ",该模式没有使用任何特殊号去匹配其他符号,而只是匹配所描述的内容,所以,能够匹配这个模式的只有包含“foo”的字符串。同理,对于字符串“Python"和“study"也样。 正则表达式的强大之处在于引入特殊字符来定义字符集、匹配子组和重复模式。正是由于这些特殊符号,使得正则表达可以匹配字符串集合而不仅仅只是某单个字符串。由此可见,普通字符表达式属于最简单的正则表达式形式。

二、非打印字符

  非打印字符也可以是正则表达式的组成部分,在下表中列出了表示非打印字符的转义序列。

字符描述
\cx匹配由x指明的控制字符。例如,\cM匹配y一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的‘C’字符
\f匹配一个换页符。等价于\x0c 和\cL
\n匹配一个换行符。等价于\x0a和\cJ
\r匹配 一个回车符。 等价于\x0d和\cM
\s匹配任何空白字符,包括空格、制表符、换页符等。等价于[\f\n\r\t\v]
\S匹配任何非空白字符。等价于[^\f\n\r\t\v]
\t匹配一个制表符。 等价于\x09和\cI
\v匹配一个垂直制表符。等价于\x0b和\cK

三、 特殊字符

  特殊字符是指一些具有特殊含义的字符, 如" * .xt"中的星号,简单一点说,就是表示任何字符串的意思。如果要查找文件名中有“ * ”的文件,则需要对“ * ”进行转义,即在其前加一个“\”,即“ \ * .txt”。许多元字符要求在试图匹配它们时特别对待,如果要匹配这些特殊字符,必须首先使字符进行转义,即将“\”放在它们前面。下表列出了正则表达式中的特殊字符。

特别字符描述
$匹配输入字符串的结尾位置,如果设置了RegExp对象的Mutiline 属性,则 $ 也匹配‘’\n’ 或^\r’。要匹配$字符本身,请使用 \ $
()标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \ ( 和 \ )
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \ *
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \ +
.匹配除换行符 \n之外的任何单字符。 要匹配 . ,请使用 \ .
[标记一个中括号表达式的开始。要匹配 [ ,请使用 \ [
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 要匹配 ? 字符,请使用 \ ?
\将下一个字符标记为或特殊字符或原义字符或向后引用或八进制转义符。例如’n’ 匹配字符 'n’。‘\ '匹配换行符。序列 “ \ \ ” 匹配“\”,而“ \ ( ‘则匹配“(“
^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配^ 字符本身,请使用 \ ^
{标记限定符表达式的开始。要匹配 { ,请使用 \ {

3.1 匹配任意单个字符

  点符号“ . ”可以匹配除了换行符“\n”以外的任何字符(Python 正则表达式有一个编译标记[S或者DOTALL,该标记能够推翻这个限制,使点号能够匹配换行符)。无论字母、数字、空格(并不包括“\n”换行符)、可打印字符、不可打印字符,还是一个符号,使用点号都能够匹配它们。例如下表中的演示信息:

正则表达式模式匹配的字符串
f.o匹配在字母“f”和“o”之间的任意一个字符;例如 fao、f9o、f#o等
任意两个字符
.end匹配在字符串 end之前的任意一个字符

3.2 从字符串起始或者结尾或者单词边界匹配

  还有一些符号和相关的特殊字符用于在字符串的起始和结尾部分指定用于搜索的模式。如果要匹配字符串的开始位置,就必须使用脱字符“^”或者特殊字符“\A”(反斜线和大写字母A)。后者主要应用于那些没有脱字符的键盘(例如,某些国际键盘)。同样,美元符号“$”或“\Z”将用于匹配字符串的末尾位置。

正则表达式模式匹配的字符串
^From任何以 From 作为起始的字符串
/bin/tcsh$任何以/bin/tcsh作为结尾的字符串
^Subject: hi$任何由单独的字符串 Subiect: hi构成的字符串
the任何包含the的字符串
\bthe任何以 the开始的字符串
\bthe\b仅仅匹配单词the
\Bthe任何包含但并不以 the 作为起始的字符串

3.3 创建字符集

  尽管句点可以用于匹配任意符号,但是在某些时候,可能想要匹配某些特定字符。正因如此,发明了中括号。该正则表达式能够匹配一对中括号中包含的任何字符。例如下表中的演示实例。

正则表达式模式匹配的字符串
b[aeiu]tbat、bet、bit、but
[cr][23][dp][o2]一个包含四个字符的字符串,第一个字符是“c”或“r”,然后是“2”或“3”,后面是“d”或“p”,最后要么是“o”,要么是“2”。例如,c2do、r3p2、r2d2、c3po等

3.4 使用闭包操作符实现存在性和频数匹配

  下面开始介绍最常用的正则表达式符号,即特殊符号*、+和?,所有这些都可以用于匹配-一个、多个或者没有出现的字符串模式。具体说明如下所示。
  (1)星号或者星号操作符(*)将匹配其左边的正则表达式出现零次或者多次的情况(在计算机编程语言和编译原理中,该操作称为Kleene闭包)。
  (2)加号(+)操作符将匹配一次或者多次出现的正则表达式(也叫作正闭包操作符)。
  (3) 问号(? )操作符将匹配零次或者一次出现的正则表达式。
  (4)大括号操作符({}) ,里面或者是单个值或者是一对由逗号分隔的值。这将最终精确地匹配前面的正则表达式N次(如果是{N})或者一定范围的次数:例如,{M, N}将匹配M ~ N次出现。这些符号能够由反斜线符号转义: \ * 匹配星号,等等。
  使用闭包操作符实现存在性和频数匹配演示的具体说明如下表所示:

正则表达式模式匹配的字符串
[dn]ot?字母“d”或者“n”,后面跟着一个“o”,然后最多是一个“t”,例如,do、 no、dot、not
0?[1-9]任何数值数字,它可能前置一个“0”,例如,匹配一系列数(表示从1~ 9月的数值),不管是一个还是两个数字
[0-9]{15,16}匹配15或者16个数字(例如信用卡号码)
</?[^>]+>匹配全部有效的(和无效的) HTML标签
[KORBNP]a-h][1-8]-[a-h][1-8]在“长代数”标记法中,表示国际象棋合法的棋盘移动(仪移动,不包括吃子和将军)。即“K”、“Q”、“R”、“B”、“N”或“P”等字母后面加上“al”~“h8”之间的棋盘坐标。前面的坐标表示从哪里开始走棋,后面的坐标代表走到哪个位置(棋格)上

3.5 表示字符集的特殊字符

  有一些特殊字符能够表示字符集,与使用“0-9”这个范围表示十进制数相比,可以简单地使用\d表示匹配任何十进制数字。另一个特殊字符 (w)能够用于表示全部字母数字的字符集,相当于[A-Za-z0-9_]的缩写形式,\s可以用来表示空格字符。这些特殊字符的大写版本
表示不匹配;例如,\D表示任何非十进制(与[^0-9]相同),等等。使用这些缩写,可以表示如下表所示的一些更复杂的实例:

正则表达式模式匹配的字符串
\w+ -\d+一个由字母数字组成的字符和一串由一个连字符分隔的数字
[A-Za-z]w*第一个字符是字母:其余字符(如果存在)可以是字母或者数字(几乎等价于Python中的有效标识符)
\d{3}-\d{3}-\d{4}美国电话号码的格式,前面是区号前缀,例如80-551-1212
\w+@\w+.com以XXX@YYY.com格式表示简单的电子邮件地址

四、使用小括号指定分组

  在python程序中,有时可能会对之前匹配成功的数据更感兴趣。我们不仅想要知道整个符串是否否匹配我们的标准,而且想要知道能否提取任何已经成功匹配的特定字符串或者子字符串。答案是可以,要实现这个目标,只要用一对小括号括住任何正则表达式,当使用正则表达式时,一对小括号可以实现以下任意一个 (或者两个)功能:
  (1)对正则表达式进行分组。
  (2)匹配子组。
  例如下表展示了使用小括号实现指定分组的使用说明:

正则表达式模式匹配的字符串
\d+(.\d*)?表示简单浮点数的字符串:也就是说,任何十进制数字, 后面可以接一 个小数点和零个或者多个十进制数字,例如“0.004、“2”、“713."等
(Mr?s?.)?[A-Z][a-z]*[A-Za-Z-]+名字和姓氏,以及对名字的限制(如果有,首字母必须大写,后续字母小写),全名前可以有可选的“Mr.“、“Mrs.”、 “Ms.” 或者"M."” 作为称谓,以及灵活可选的姓氏,可以有多个单词、横线以及大写字母

五、限定符

  限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,有*或+或?或{n}或{n,}或{n,m}共6种。正则表达式中的限定符信息如下表所示:

字符描述
*匹配前面的子表达式零次或多次,例如,zo*能匹配”z” 以及“zoo”。*等价于{0,}
+匹配前面的子表达式一次或多次。例如,“zo+” 能匹配“zo” 以及“zoo”, 但不能匹配“z”。+等价于{1,}
?匹配前面的子表达式零次或一次。例如,“do(es)?"可以匹配“do"或“does"中的“do”。?等价于{0,1}
{n}n是一个非负整数。匹配确定的n次。例如, ‘o{2}’ 不能匹配“Bob” 中的‘o’,但是能匹配“food"中的两个o
{n,}n是一个非负整数。至少匹配n次。例如, ‘o{2,},不能匹配“Bob” 中的‘o’,但能匹配“fooood”中的所有o. “o{1,}” 等价于“o+’。'o{0,}‘则等价于‘o*’
{n,m}m和n均为非负整数,其中n<= m。最少匹配n次且最多匹配m次。例如,“o{1,3}” 将匹配“fooood” 中的前3个o。 ‘o{0.1}’ 等价于’o?’。请注意在逗号和两个数之有空格

六、定位符

  通过使用定位符,可以将正则表达式固定到行首或行尾。另外还可以帮助我们创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b描述单词的前成后边界,\B表示非单词边界。常用的正则表达式的定位符如下表所示:

字符描述
^匹配输入字符串开始的位置。如果设置了RegExp对象的Mutine属性,^还会与\n或\r之后的位置匹配
$匹配输入字符串结尾的位置。如果设置了RegExp 对象的Mutine属性,$还会与\n或\r之前的位置匹配
\b匹配-一个字边界,即字与空格间的位置
\B非字边界匹配

七、限定范围和否定

  除了单字符以外,字符集还支持匹配指定的字符范围。方括号中两个符号中间用连字符“-” 连接,用于指定一个字符的范围,例如,A-Z、a-z或者0-9分别用于表示大写字母、小写字母和数值数字。这是一个按照字母顺序的范围,所以不能将它们仅仅限定用于字母和十进制数字上。另外,如果脱字符“^”紧跟在左方括号后面,这个符号就表示不匹配给定字符集中的任何一个字符。具体演示实例如下表所示:

正则表达式模式匹配的字符串
z.[0-9]字母"z”后面跟着任何一个字符,然后跟着一个数字
[r-u][env-y][us]字母“r”、"s”、“t”或者“u” 后面跟着“e”、“n”、“v”、“w”、“x”或者“y”,然后跟着“u”或者“s”
[^aeiou]一个非元音字符
[^\t\n]不匹配制表符或者\n
[“-a]在一个ASCII系统中,所有字符都位于““”和“a”之间,即34-97之间

八、 运算符优先级

  正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序。

运算符描述
\转义符
(),(? : ),(?=),[]小括号和方括号
*,+,?, {n}, {n,}, {n,m}限定符
^,$,\ 任何元字符、任何字符定位点和序列 (即: 位置和顺序)

九、 扩展表示法

  扩展表示法以问号开始(?…) ,通常用于在判断匹配之前提供标记,实现一个前视(或者后视)匹配或者条件检查。尽管小括号使用这些符号,但是只有(? P < name>) 表述一个分组匹配,所有其他的都没有创建一个分组。 然而,你仍然需要知道它们是什么?因为它们可能最适合用于你所需要完成的任务。下表展示了扩展表示法的基本用法:

正则表达式模式匹配的字符串
(?:\w+.)*以句点作为结尾的字符串,例如"gogel.“、 “itte.”、 “fcbook,”, 但是这些匹配不会保存下来供后续的使用和数据检索
(?#comment)此处并不做匹配, 只是作为注释
(?=.com)如果一个字符串后面跟着“.com”才做匹配操作,并不使用任何目标字符串
(?!.net)如果一个字符串后面不是跟着“.net" 才做匹配操作
(?<=800-)如果宇符串之前为"800-"才做匹配。假定为电话号码,同样,并不使用任何输入字符串
(?<!192 \ .168\ .)如果个字符串之前不是"192.168"才做匹配操作,假定用于过滤掉一组C类IP地址
(?(1)y l x)如果一个匹配组1(\C)存在,就与y匹配;否则,就与x匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值