知道【正则表达式】可能意味着用3步解决一个问题,而不是用3000步,如果你是一个技术怪侠,别忘了你用几次快捷键就能解决的问题,其他人需要数天的繁琐工作才能解决,而且他们还容易犯错。
—- Cory Doctorow
正则表达式总结:
- ()添加小括号将在正则表达式中创建分组,
- ?匹配[0,1]次前面的分组
- *匹配[0,多]次前面的分组
- +匹配[1,多]次前面的分组
- {}匹配特定次数或者特定范围次数的前面的分组
- {N} 匹配 N 次前面的分组
- {N,}匹配[N, 多]次前面的分组
- {,N}匹配[0,N]次前面的分组
- {N,M}匹配[N,M]次前面的分组进行贪心(最大)匹配
- {N,M}?匹配[N,M]次前面的分组进行非贪心(最小)匹配
- *?或+?对前面的分组进行最小匹配。
- ^span匹配的字符串必须以span开头
- span$匹配的字符串必须以span结束
- . 匹配所有字符(一个字符),换行符除外
- \d,\w和\s分别匹配数字(0-9),单词(任意字母,数字或下划线),和空格(空格,制表符,换行符),
- \D,\W,\S分别匹配出除数字,单词(任意字母,数字或下划线),空格(空格,制表符,换行符)以外的所有字符
- [abca-zA-Z0-9]匹配方括号中的任意字符
- [^abc]匹配不在方括号内的任意字符
python中使用正则表达式
import re #导入模块
x = re.compile(r’(\d\d\d)-(\d\d\d-\d\d\d\d) ‘) # 创建一个匹配对象 ,python 的转义字符要加
mo = x.search(‘My number is 415-555-4242. ‘) # 搜索匹配正则
mo.group() #匹配的结果
使用group()匹配对象的方法从一个分组中获取匹配的文本,查找的是第一个匹配对象
group()和group(0)返回完整的匹配
group(1),group(2) 返回对应第几个括号中的匹配值
groups() 返回多个匹配值的元组
mo.groups()
(‘415’,’555-4242’)
areacode,mainNumber = mo.groups()
areacode = 415
mainNumber = 5555-4242
用管道匹配多个分组(|)
字符‘|’称为管道,希望匹配多个值时使用r’a|b|c’将匹配a或b或c
使用findall() 可以找出所有的匹配结果
只有正则表达式中没有分组,返回的是一个字符串列表。
如果有分组,findall将返回一个匹配的元组的列表。
用问号?实现可选匹配
re.compile(r’[aeiouAEIOU]’)匹配单词中的元音字母
re.compile(r’[^aeiouAEIOU]’)匹配单词中的非元音字母
在[]中的普通的正则表达式符合不会被解释,所以不要在前面(.,*,?,(,),)加转义的反斜杠(\)
点-星(.*)能匹配除换行外的所有字符,通过对re.comile()的第二个参数传人re.DOTALL,可以让句点字符匹配包括换行字符。
用sub()方法替换字符串
管理复杂的正则表达式
比较复杂的需要长的费解的正则表达式,可以传人re.VERBOSE 作为re.compile()的第二个参数,可以忽略正则表达式中的空白符和注释。从而缓解复杂
1 | eg: phoneRx = re.compile(r'((\d{3}|\(\d3\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})?)') |
使用re.IGNORECASE 忽略大小写
someRx = re.compile(‘foo’,re.IGNORECASE|re.DOTALL|re.VERBOSE) #按位或来组合使用