)
\d | 0到9任何数字 |
---|---|
\D | 除0到9数字外的任何字符 |
\w | 任何字母、数字或下划线的字符(可认为匹配“单词”) |
\W | 除字母、数字或下划线外的任何字符 |
\s | 空格、制表符或换行符(可认为匹配“空白”字符) |
\S | 空格、制表符或换行符以外的任何字符 |
>>> xmasRegex=re.compile(r'\d+\s\w+')
>>> xmasRegex.findall('12 drummers, 11 pipers, 10 lords, 9 ladies, 8 maids,7 swans,6 geese, 5 ringd, 4 birds, 3 hens, 2 doves, 1 partridge')
['12 drummers', '11 pipers', '10 lords', '9 ladies', '8 maids', '7 swans', '6 geese', '5 ringd', '4 birds', '3 hens', '2 doves', '1 partridge']
>>>
注意:这里(\d+)匹配一个或多个数字;(\w+)匹配一个或多个字母、数字、下划线
🚄🚃使用方括号建立自己的字符分类
方括号定义自己所需字符,也可以是[0-5]等等
>>> import re
>>> vowelRegex=re.compile(r'[aeiouAEIOU]')
>>> vowelRegex.findall('RoboCopeats baby food. BABY FOOD.')
['o', 'o', 'o', 'e', 'a', 'a', 'o', 'o', 'A', 'O', 'O']
>>> consonantRegex=re.compile(r'[^aeiouAEIOU]')#通过在左括号上方加入^,可以匹配出不在这个字符类中的所有字符
>>> consonantRegex.findall('RoboCop eats baby food, BABY FOOD')
['R', 'b', 'C', 'p', ' ', 't', 's', ' ', 'b', 'b', 'y', ' ', 'f', 'd', ',', ' ', 'B', 'B', 'Y', ' ', 'F', 'D']
🚄🚃插入字符和美元字符
注:这里也有^ ,注意和[ ^ …… ]做出区别
^代表匹配必须发生在查找文本开始处,即文本是以该字符开始的;
$表示该字符串必须以这个正则表达式的模式结束;
两者可以同时使用,表明整个字符串必须匹配该模式
>>> beginsWithHello=re.compile(r'^Hello')#必须以Hello开始
>>> beginsWithHello.search('Hello world!')
<re.Match object; span=(0, 5), match='Hello'>#返回都是这种格式
>>> beginsWithHello.search('He said hello.')==None#没有以Hello开始,因此。。。
True
>>> endsWithNumber=re.compile(r'\d$')#没有+,只能匹配**最后一个数字**
>>> endsWithNumber.search('Your number is 42')#必须以数字结尾
<re.Match object; span=(16, 17), match='2'>
>>> endsWithNumber.search('Your number is forty two.')==None
True
>>> wholeStringIsNum=re.compile(r'^\d+$')#两者可以同时使用,表明整个字符串必须匹配该模式(必须全部是数字)
>>> wholeStringIsNum.search('1234567890')
<re.Match object; span=(0, 10), match='1234567890'>
>>> wholeStringIsNum.search('1234xyz67890')#中间有字母,不符合\d+模式,因此无输出,且下一句输出True
>>> wholeStringIsNum.search('1234xyz67890')==None
True
>>> wholeStringIsNum.search('1234567890')
<re.Match object; span=(0, 10), match='1234567890'>
>>> wholeStringIsNum.search('1234567890')==None
False
注意:上面之所以会输出Match。span那么一堆,是因为没有使用正常公式,下面这一句可以参照一下
>>> wholeStringIsNum=re.compile(r'^\d+$')
>>> mo1=wholeStringIsNum.search('1234567890')
>>> mo1.group()
'1234567890'
作为对比,我自己尝试了下使用findall()替换search(),具体区别如下:
>>> wholeStringIsNum.findall('1234567890')#功能一样,但没有输出Match、跨度span等哪一些。。。
['1234567890']
>>> wholeStringIsNum.findall('123456xyz78990')#注意这里的区别,会输出一个空的列表
[]
>>> wholeStringIsNum.findall('123456xyz7890')==None#重点注意,findall这里并不是None
False
>>> wholeStringIsNum.findall('12345 5667')#这一步没啥特别的,主要是测试一下空格的影响,仍然是印证了^和$都在时,必须全部匹配
[]
>>> ~~endsWithNum=re.conpile(r'\d$')~~ #这一是说错了,但让我注意到\d和\d+的区别,返回上去看一下✌
>>> endsWithNum=re.compile(r'\d+$')
>>> endsWithNum.findall('fd adds 21342')
['21342']
>>> endsWithNum.findall('fd adds 213 12314')#仍然是验证空格
['12314']