python 正则表达式练习

知道【正则表达式】可能意味着用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
2
3
4
5
6
7
8
9
10
eg: phoneRx = re.compile(r'((\d{3}|\(\d3\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})?)')

phoneRx = re.compile(r'''(
(\d{3}|\(d{3}\))? #区号
(\s|-|\.)? #分隔
\d{3} #前三
(\s|-\.) #分隔
\d{4} #后四
(\s*(ext|x|ext.)\s*\d{2,5})? #扩展
)''',re.VERBOSE)

使用re.IGNORECASE 忽略大小写
someRx = re.compile(‘foo’,re.IGNORECASE|re.DOTALL|re.VERBOSE) #按位或来组合使用