前言
之前一直听说正则表达式,而且还比较难,今天终于接触了,做好了啃硬骨头的准备,让我们一起感受一下。
一、预定字符"\d"
咋一看的印象,正则表达式就好像我们查找文件用的通配符,具体能用在哪些场景,我还是具体学习吧。
第一个题目就是用正则表达式匹配数字。使用正则表达式需要导入模块re,re模块是内置模块,不需要导入,可以直接使用,可以使用findall方法自动将表达式和字符串匹配,具体代码如下:
import re string = '每天3问是哪个人才想出来的4.56' print('匹配数字:',re.findall('\d',string))
最后的输出结果是匹配数字: ['3', '4', '5', '6'],可以看到数字全部输出,输出结果保存在一个列表里。\d的意思就是0-9的数字
二、预定字符"\s"
预定字符\s匹配的是空白字符,空白字符就是换行、退格、换页等字符。具体代码如下:
import re string = '每天3问 是哪' \ '个\\脑子\n想出\t来\f的4.56' print('匹配数字:',re.findall('\s',string))
运行结果为:匹配数字: [' ', '\n', '\t', '\x0c'],我们发现\\没有打印出来,我还试了\a、\b、\e都打印不出来,难道他们不属于空白字符?
三、预定字符“\w”
“ \w”匹配非空白字符,那就是作用与“\s”相反,我们来试一下。
import re string = '每天3问 是哪' \ '个\e脑\a子\n想\b出\t来\f的4.56' print('匹配数字:',re.findall('\w',string))
输出结果为:匹配数字: ['每', '天', '3', '问', '是', '哪', '个', 'e', '脑', '子', '想', '出', '来', '的', '4', '5', '6'],我们发现数字、字母和汉字都匹配出来了。
四、参数re.A
findall方法还是带参数的,上个例子中,我们输出了数字、字母、汉字,如果我们不想匹配汉字,就可以带上参数re.A,代码这样写print('匹配数字:',re.findall('\w',string,re.A)),输出结果为:匹配数字: ['3', 'e', '4', '5', '6'],果然没有了汉字。
五、限定符
书上说*号表示匹配字符串0次或者多次,?表示匹配字符串0次或者1次,例如o*r表示匹配字母o0次或者多次。
import re # 匹配0次或多次的字符串 pattern1 = 'a*' text1 = 'aaabaaa' result1 = re.findall(pattern1, text1) print(result1) # ['aaa', ''] # 匹配0次或1次的字符串 pattern2 = 'a?' text2 = 'aaabaaa' result2 = re.findall(pattern2, text2) print(result2) # ['a', 'a', 'a']
感觉有点难理解,我个人觉得这样说好一点,o*r表示有多个连续的o或者没有o加上r就能匹配,例如:r,or,ooooor等。同理o+r就是至少有1个o加上r才能匹配,例如or,ooor。r是不符合表达式要求的
总结
正则表达式是一种可以在程序和编程语言中使用的特殊形式的文本模式。它可以用来验证输入是否符合给定的文本模式,或者在一大段文本中查找匹配该模式的文本,或者用其他文本来替换匹配的文本。
以下是一些常用的正则表达式:
- .:匹配任意字符(除了换行符)
- *:匹配前面的字符0次或多次
- +:匹配前面的字符1次或多次
- ?:匹配前面的字符0次或1次
- {n}:匹配前面的字符n次
- {n,}:匹配前面的字符至少n次
- {n,m}:匹配前面的字符至少n次,但不超过m次
- [abc]:匹配a、b或c中的任意一个字符
- [^abc]:匹配除a、b或c之外的任意一个字符
- []:表示空集,即不匹配任何字符