python re(五)

  1. 执行匹配
  2. 一旦你有了已经编译了的正则表达式的对象,你要用它做什么呢?`RegexObject` 实例有一些方法和属性。这里只显示了最重要的几个,如果要看完整的列表请查阅 Python Library Reference
  3. 方法/属性作用
    match()决定 RE 是否在字符串刚开始的位置匹配
    search()扫描字符串,找到这个 RE 匹配的位置
    findall()找到 RE 匹配的所有子串,并把它们作为一个列表返回
    finditer()找到 RE 匹配的所有子串,并把它们作为一个迭代器返回

  4. 如果没有匹配到的话,match() 和 search() 将返回 None。如果成功的话,就会返回一个 `MatchObject` 实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。
  5. 你可以用采用人机对话并用 re 模块实验的方式来学习它。如果你有 Tkinter 的话,你也许可以考虑参考一下 Tools/scripts/redemo.py,一个包含在 Python 发行版里的示范程序。
  6. 首先,运行 Python 解释器,导入 re 模块并编译一个 RE:
  7. #!python

  8. Python 2.2.2 (#1, Feb 10 2003, 12:57:01)

  9. >>> import re

  10. >>> p = re.compile('[a-z]+')

  11. >>> p

  12. <_sre.SRE_Pattern object at 80c3c28>

  13. 现在,你可以试着用 RE 的 [a-z]+ 去匹配不同的字符串。一个空字符串将根本不能匹配,因为 + 的意思是 “一个或更多的重复次数”。 在这种情况下 match() 将返回 None,因为它使解释器没有输出。你可以明确地打印出 match() 的结果来弄清这一点。
  14. #!python

  15. >>> p.match("")

  16. >>> print p.match("")

  17. None
  18. 现在,让我们试着用它来匹配一个字符串,如 "tempo"。这时,match() 将返回一个 MatchObject。因此你可以将结果保存在变量里以便后面使用。
  19. #!python

  20. >>> m = p.match( 'tempo')

  21. >>> print m

  22. <_sre.SRE_Match object at 80c4f68>
  23. 现在你可以查询 `MatchObject` 关于匹配字符串的相关信息了。MatchObject 实例也有几个方法和属性;最重要的那些如下所示:
  24. 方法/属性作用
    group()返回被 RE 匹配的字符串
    start()返回匹配开始的位置
    end()返回匹配结束的位置
    span()返回一个元组包含匹配 (开始,结束) 的位置

  25. 试试这些方法不久就会清楚它们的作用了:
  26. #!python

  27. >>> m.group()

  28. 'tempo'

  29. >>> m.start(), m.end()

  30. (0, 5)

  31. >>> m.span()

  32. (0, 5)
  33. group() 返回 RE 匹配的子串。start() 和 end() 返回匹配开始和结束时的索引。span() 则用单个元组把开始和结束时的索引一起返回。因为匹配方法检查到如果 RE 在字符串开始处开始匹配,那么 start() 将总是为零。然而, `RegexObject` 实例的 search 方法扫描下面的字符串的话,在这种情况下,匹配开始的位置就也许不是零了。
  34. #!python

  35. >>> print p.match('::: message')

  36. None

  37. >>> m = p.search('::: message') ; print m

  38. <re.MatchObject instance at 80c9650>

  39. >>> m.group()

  40. 'message'

  41. >>> m.span()

  42. (411)
  43. 在实际程序中,最常见的作法是将 `MatchObject` 保存在一个变量里,然后检查它是否为 None,通常如下所示:
  44. #!python

  45. = re.compile(  )

  46. = p.match( 'string goes here' )

  47. if m:

  48. print 'Match found: ', m.group()

  49. else:

  50. print 'No match'

  51. 两个 `RegexObject` 方法返回所有匹配模式的子串。findall()返回一个匹配字符串行表:

  52. #!python

  53. >>> p = re.compile('"d+')

  54. >>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')

  55. ['12''11''10']
  56. findall() 在它返回结果时不得不创建一个列表。在 Python 2.2中,也可以用 finditer() 方法。
  57. #!python

  58. >>> iterator = p.finditer('12 drummers drumming, 11  10 ')

  59. >>> iterator

  60. <callable-iterator object at 0x401833ac>

  61. >>> for match in iterator:

  62.      print match.span()


  63. (0, 2)

  64. (2224)

  65. (2931)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值