正则表达式
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。python中使用re.match()
函数来判断给定字符串和正则表达式是否匹配,匹配是从左到右进行匹配,直到正则表达式匹配完或匹配失败,若匹配成功,则返回Match
对象,否则返回None
。
\n
匹配换行符,\f
匹配换页符,\t
匹配制表符,\r
匹配回车符,\t
匹配任何空白字符(空格,制表符,换页符等),\w
匹配任何一个数字或字母,\d
匹配一个数字,.
匹配任意字符。- 许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:
- $: 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 ‘$’。
- ( ):标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
- *:匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
- +:匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
- .:匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 .
- [:标记一个中括号表达式的开始。要匹配 [,请使用
- ?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请
- \: 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’
- ^:匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符
- {:标记限定符表达式的开始。要
- |: 指明两项之间的一个选择。要匹配 |,请使用 |。
- 限定符用来指定组件应出现的次数:*表示出现0次,1次或多次;+表示出现一次或多次;?表示出现0或1次;{n}表示出现n次;{n,}表示至少出现n次;{n,m}表示出现n到m次。
- []表达式用来匹配给定范围的***一个字符***,比如[!a-zA-Z\s]可以用来匹配’!’、小写字母、大写字母、空白字符。
- ()用来进行选择,比如(ab|xy|ef)可以匹配‘ab’、‘xy’、和’ef’。同时还具有提取分组(Group)的功能,放在()中的能够视为一个整体。来看个例子,我们希望能够匹配像前面几个是数字,中间是任意个abc,最后是yesterday、today或tomorrow的字符串:
import re
s = input('输入一个字符串:')
if re.match('\d*(abc)*(yesterday|today|tomorrow)', s):
print('yes')
else:
print('no')
运行结果如下:
输入 12yesterday
In [24]: runfile(‘C:/Users/Whisky/.spyder-py3/temp.py’, wdir=‘C:/Users/Whisky/.spyder-py3’)
输入一个字符串:12yesterday
yes
输入 1abctoday
In [25]: runfile(‘C:/Users/Whisky/.spyder-py3/temp.py’, wdir=‘C:/Users/Whisky/.spyder-py3’)
输入一个字符串:1abctoday
yes
输入 12345645abcabcabctomorrow
In [26]: runfile(‘C:/Users/Whisky/.spyder-py3/temp.py’, wdir=‘C:/Users/Whisky/.spyder-py3’)
输入一个字符串:12345645abcabcabctomorrow
yes
如果我们要提取字符串中的某些子串也可以使用():
import re
s = input('输入一个字符串:')
m = re.match('<([a-zA-Z]+)>\{(\d+)\}', s)
if m:
print('匹配的串为 %s' % m.group(0))
print('name: %s' % m.group(1))
print('age: %s' % m.group(2))
else:
print('匹配失败!')
运行结果如下:
In [28]: runfile(‘C:/Users/Whisky/.spyder-py3/temp.py’, wdir=‘C:/Users/Whisky/.spyder-py3’)
输入一个字符串:{10}
匹配的串为 {10}
name: Dolly
age: 10
In [30]: runfile(‘C:/Users/Whisky/.spyder-py3/temp.py’, wdir=‘C:/Users/Whisky/.spyder-py3’)
输入一个字符串:{23}
匹配的串为 {23}
name: Mike
age: 23
group(0)
是匹配的字符串。
- *和+默认是贪婪匹配,即尽可能匹配多的字符串,如果要使用非贪婪匹配则需要再加上?,见下面的例子:
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由于默认采用贪婪匹配,故(\d+)
尽可能匹配多的字符串,导致(0*)
匹配空字符串。要使+采用非贪婪匹配在其后加上?
就行了:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')