正则表达式(1) - 基本的概念

1、简介
正则表达式为高级的文本模式匹配、抽取、与/或文件形式的搜索和替换功能提供了基础。简单地说,正则表达式是一些字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串。
Python通过标准库中的re模块来支持正则表达式。
核心提示:搜索和匹配的比较
术语“匹配”指的是术语“模式匹配”。在Python术语中,主要有两种方式完成模式匹配:“搜索”,即在字符串任意部位中搜索匹配的模式;而“匹配”是指判断一个字符串能否从起始处全部或部地匹配某个模式。搜索通过search()函数或方法实现,而匹配通过match()或方法实现。
第一个正则表达式
前面讲到,正则表达式是包括文本和特殊字符的字符串,该字符串描述一个可以识别各种字符串的模式。我们还简单阐述了正则表达式字母表,对于通用文本,用于正则表达式的字母表是所有大小写字母及数字的集合。也可能存在着一些特殊字母。
现在,让我们看看正则表达式的大部分基本内容,虽然正则表达式通常被视为“高级主题”,但是它们其实也非常简单。把标准字母表用于通用文本,我们展示了一些简单的正则表达式以及这些模式所表述的字符串。下面所介绍的正则表达式都是最基本、最普通的。它们仅仅用一个简单的字符串构造成一个匹配字符串的模式:该字符串由正则表达式定义。下面所示为几个正则表达式和它们所匹配的字符串。

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

| abc123 | abc123|
上面的第一个正则表达式模式是“foo”。该模式没有使用任何特殊符号去匹配其他符号,而只匹配所表述的内容,所以,能够匹配这个模式的只有包含“foo”的字符串。同理,对于字符串“Python”和“anc123”也一样。正则表达式的强大之处在于引入特殊字符来定义字符集、匹配子组和重复模式。正是由于这些特殊符号,使得正则表达式可以匹配字符串集合,而不仅仅是某个字符串。
2、特殊符号和字符
本节介绍最常见的特殊符号,即所谓的元字符。正是它给予正则表达式强大的功能和灵活性。
1.2.1 使用择一匹配符号匹配多个正则表达式
选择择一匹配的管道符号(|),也就是键盘上的竖线,表示一个“从多个模式中选择其一”的操作。它用于分割不同的正则表达式。例如,在下面的表格中,左边是一些运用择一匹配的模式,右边是左边相应的模式能够匹配的字符。

正则表示式模式匹配的字符串
at|homeat、home
r2d2|c3por2d2、c3po
bat|bet|bitbat、bet、bit

有了这个符号,就能够增强正则表达式的灵活性,使得正则表达式能够匹配多个字符串而不仅仅是一个字符串。择一匹配有时候也称作并(union)或者逻辑或(logical OR)。
1.2.2 匹配任意单个字符
点号或者句号(.)符号匹配除了换行符\n以外的任何字符(Python正则表达式有一个编程标记[S或者DOTALL],该标记能够推翻这个限制,使点号能够匹配换行符)。无论字母、数字、空格(并不包括“\n”换行符)、可打印字符、不可打印字符,还是一个符号,使用点号能够匹配它们。

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

1.2.3 从字符串起始或者结尾单词边界匹配
还有些字符和相关的特殊字符用于在字符串的起始和结尾部分指定用于搜索的模式。如果要匹配字符串的开始位置,就必须使用脱字符(^)或者特殊字符\A(反斜线和大写字母A)。后者主要用于那些没有脱字符的键盘。同样,美元符号($)或者\Z将用于匹配字符串的末尾位置。
使用这些富豪的模式是有所不同的。因为这些模式指定了位置或方位。之前的"核心提示"记录了匹配(试图在字符串的开始位置进行匹配)和搜索(试图从字符串的任何位置开始匹配)之间的差别。正因如此,下面是一些表示“边界绑定”的正则表达式搜索模式的示例。

正则表达式模式匹配的字符串
^From任何以From作为起始的字符串
/bin/tcsh$任何以/bin/tcsh作为结尾的字符串
^Subject:hi$任何由单独的字符串SUbject:hi构成的字符串

再次说明,如果想要逐字匹配这些字符串中的任何一个(或者全部),就必须使用反斜线进行转义。例如,如果你想要匹配任何以美元符号结尾的字符串,一个可性的正则表达式方案就是使用模式.$$。
特殊字符\b和\B可以用来匹配字符边界。而两者的区别就在于\b将用于匹配一个单词的边界,这意味着如果一个模式必须位于 单词的起始部分,就不管该单词前面
(单词位于字符产中间)是否有任何字符(单词位于行首)。同样,\B将匹配一个单词中间的模式(即,不是单词边界)。下面是一些示例。

正则表达式匹配的字符串
the任何包含the的字符串
\bthe任何以the开始的字符串
\bthe\b仅仅匹配单词the
\Bthe任何包含并不以the作为起始的字符串

1.2.4 创建字符集
j尽管句号可以用于匹配任意符号,但某些时候,想要匹配某些特定字符串。正因如此,发明了方括号。该正则表达式能够匹配一对方括号中包含的任何字符。下面为一些示例。

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

关于[cr][23][dp][o2]这个正则表达式有一点需要说明:如果仅允许“r2d2”或者“c3po”作为有效字符串,就需要更严格限定的正则表达式。因为方括号仅仅表示逻辑或的功能,所以使用方括号并不能实现这一限定条件。唯一的方案就是择一匹配,例如,r2d2|c3po。
r然而,对于单个字符的正则表达式,使用择一匹配和字符集是等效的。例如,我们以正则表达式“ab”作为开始,该正则表达式只匹配包含字母“a”且后面跟着字母“b”的字符串,如果我们想要匹配一个字母的字符串,例如:要么匹配“a”,要么匹配“b”,就可以使用正则表达式[ab],因为此时字母“a”和字母“b”,是相互独立的字符串。我们也可以选择正则表达式a|b。然而,如果我们想要匹配满足模式“ab”后面且跟着cd的字符串,我们就不能使用方括号,因为字符集的方式只适用于单字符的情况。这种情况下,唯一的方法就是使用ab|cd,这与刚才提到的问题相同。
1.2.5 限定范围和否定
除了单字符以外,字符集还支持匹配指定的字符范围。方括号中两个符号中间连字符(-)连接,用于指定一个字符的范围:例如: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

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

操作符(符号表示)含义
星号或者信号操作符(*)将匹配其左边正则表达式出现零次或者多次的情况(在计算机编程语言和编译原理中,该操作称为Kleene闭包)
加号(+)将匹配一次或者多次出现的正则表达式(也叫正闭包操作符)
问号(?)将匹配零次或者一次出现的正则表达式
大括号操作符({},里面或者单个值或者是一对由逗号分隔的值)将最终精确地匹配前面地正则表达式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标签
[KQRBNP][a-h][1-8]-[a-h][1-8]在“长代数”标记法中,表示国际象棋合法的棋盘移动(仅移动,不包括吃子和将军)。即“K“、”Q“、”R“、”B“、”N“或”P“等字母后面加上”a1“~”h8“之间的棋盘坐标。前面的坐标表示从哪里开始走棋,后面的坐标代表走到哪个位置上

1.2.7 表示字符集的特殊字符

特殊字符含义
\d表示匹配任何十进制数字
\w表示全部字母数字的字符集,相当于[A-Za-z0-9]的缩写
\s表示空格字符

注:这些特殊字符的大写版本表示不匹配。*
例子:

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

1.2.8 使用圆括号指定分组
w1我们不仅想知道整个字符串是否匹配我们的标准,而且想知道能否提取任何已经匹配的特定字符串或者子字符串。要实现这个目标,只要用一对圆括号包囊任何正则表达式。
当使用正则表达式时,一对圆括号可以实现以下任意一个(或者两个)功能:
1、对正则表达式进行分组;
2、匹配子组

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

1.2.9 拓展表达式——“?”

正则表达式模式匹配的字符串
(?:\w+.)*以句号作为结尾的字符串,例如:“google.”、"twitter.”、“facebook.”,但是这些匹配不会保存下来供后续的使用和数据检索
(?#comment)此处并不做匹配,只是作为注释
(?=.com)如果一个字符串后面跟着”.com“才做匹配,并不适用任何目标字符串
(?!.net)一个字符串后面不是跟着”.net“才做匹配
(?<=800-)如果字符串之前为”800-“才做匹配
(?<!192.168.)如果字符串之前不是”192.168.“才做匹配操作
(?(1)y|x)如果一个匹配组1(\1)存在,就与y匹配;否则,就与x匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值