用Python解读正则表达式

摘要

正则表达式又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是一种对字符串操作的逻辑公式,通常被用来检索、替换那些符合某个“规则”的文本。其是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则表达式又称规则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是一种对字符串操作的逻辑公式,通常被用来检索、替换那些符合某个“规则”的文本。其是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则表达式的特点

1. 非常强的灵活性、逻辑性和功能性;

2. 可以迅速地用极简单的方式达到字符串的复杂控制;

3. 对于刚接触的人来说,比较晦涩难懂。

给定一个字符串和一个正则表达式,我们可以达到如下的目的:

1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式作为一门被称为“火星文字”的语言,凭借其强大的功能、简单的使用方式已经渗透到多种编程语言中。许多程序设计语言都支持直接利用正则表达式进行字符串操作,比如JavaScript等。令人遗憾的是,Python虽然被称为是“通用的高级编程语言”,但是它却并不支持直接使用正则表达式,要想在书写代码的时候使用正则需要导入“re”模块,这也是笔者要为什么用Python来阐述正则表达式的原因。

  1. ^       #匹配字符串的开头
  2. $       #匹配字符串的末尾
  3. .       #匹配除换行符之外的任意字符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
  4. []      #用来表示一组字符,匹配[]中的任意一个字符。如:[abc],则可匹配'a'或'b'或'c'
  5. [^]     #匹配不在[]中的字符:如:[^abc] 匹配除了a、b、c之外的任意字符
  6. a|b     #匹配a或b
  7. \w      #匹配字母、数字、下划线,等价于[A-Za-z_0-9]
  8. \W      #匹配非字母、数字、下划线,等价于[^A-Za-z_0-9]
  9. \s      #匹配任意空白字符,等价于[\t\n\r\f]
  10. \S      #匹配任意非空字符
  11. \d      #匹配任意一个数字,等价于[0-9]
  12. \D      #匹配任意非数字,等价于[^0-9]
  13. \A      #匹配字符串开始
  14. \z      #匹配字符串结束
  15. \Z      #匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
  16. \G      #匹配最后匹配完成的位置
  17. \b      #匹配一个单词边界,也就是指单词和空格间的位置。如:"ve\b",可以匹配"love"中的"ve",但不能匹配"very"中的"ve"
  18. \B      #匹配非单词边界。如:"ve\B",可以匹配"very"中的"ve",但不能匹配"love"中的"ve"
  19. \n      #匹配一个换行符
  20. \t      #匹配一个制表符
  21. re?     #匹配0个或1个的表达式,非贪婪方式
  22. re*     #匹配0个或多个的表达式
  23. re+     #匹配1个或多个的表达式
  24. (re)    #匹配括号内的表达式
  25. re{n}   #精确匹配n次前面表达式
  26. re{n,}  #精确匹配n到无穷多次前面表达式
  27. re{n,m} #精确匹配n到m次前面表达式
  28. # 修饰符
  29. re.I    #匹配时忽略大小写
  30. re.M    #多行匹配,影响^和$
  31. re.X    #给予你更灵活的格式以便你将正则表达式写得更易于理解
  32. re.L    #做本地化识别(locale-aware)匹配
  33. re.S    #使.匹配包括换行在内的所有字符
  34. re.U    #根据Unicode字符集解析字符。这个标志影响\w, \W, \b, \B

Python常用正则方法

re.match

尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,则返回None。

  1. import re
  2. print(re.match('Hello', 'Hello Python').span())     # 在起始位置匹配
  3. # (0, 5)
  4. print(re.match('Python', 'Hello Python'))           # 不在起始位置匹配
  5. # None

re.search

扫描整个字符串并返回第一个成功的匹配。

  1. import re
  2. print(re.search('Hello', 'Hello Python').span())    # 在起始位置匹配
  3. # (0, 5)
  4. print(re.search('Python', 'Hello Python').span())   # 不在起始位置匹配
  5. # (6, 12)

注:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.sub

用于替换字符串中的匹配项。

  1. import re
  2. number = '400-888-8888 # 这是一个400电话'
  3. # 删除字符串中的Python注释
  4. num1 = re.sub(r'#.*$', '', number)
  5. print('电话是: ', num1)
  6. # 电话是: 400-888-8888
  7. # 删除字符串中的连字符
  8. num2 = re.sub(r'\D', '', num1)
  9. print('电话是: ', num2)
  10. # 电话是: 4008888888
shaw

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: