Python Docs关于正则表达式错误“\ b”?

时间:2013-09-18 01:07:22

标签: python regex

由于我昨天得到了一个问题的帮助 - Python 2.7 - find and replace from text file, using dictionary, to new text file - 我今天开始学习正则表达式来理解@Blckknght在他的回答中为我创造的正则表达式代码。

然而,在我看来,对于\b代码,python文档(或者更可能是我)略微不正确。我在关于\ b的python文档中引用的部分是:

  

例如,r'\ bfoo \ b'匹配'foo','foo。','(foo)','bar foo baz'但不匹配'foobar'或'foo3'。

(链接到页面http://docs.python.org/2/library/re.html

我无法理解'bar foo baz'是如何匹配的?例如,如果我创建此代码:

import re

m = re.search(r'\bfoo\b', 'bar foo baz')
m.group()

...然后我从控制台得到这个结果:

'foo'

......而不是

'bar foo baz'

实际上基于python文档中关于'\ b'的其余解释,我实际上期望'foo'打印到控制台,因为它匹配开头和结束时的空字符串字。

那么,'bar foo baz'匹配的python文档中的交易是什么?

编辑:我正在使用python 2.7

1 个答案:

答案 0 :(得分:20)

  

我实际上希望'foo'打印到控制台,因为它匹配单词开头和结尾的空字符串。

您的意思是写' foo ',每端有空格吗?它不会捕获空格,因为\b匹配过渡,字符之间的间隙,而不是字符本身。


正则表达式上的一些乱码

正则表达式系统将字符串视为“令牌”流,其中令牌与文本文件中的字符之间存在 1:1的关系。像\bfoo\b这样的表达式只是为类似吃豆人的机器人编写规则的一种超短路方式。

例如,假设我们有foo b4r b@z。令牌流可能类似于:

misc    :  start_of_string
misc    :  word_boundary
letter  :  'f'
letter  :  'o'
letter  :  'o'
misc    :  word_boundary
wspace  :  ' '
misc    :  word_boundary
letter  :  'b'
number  :  '4'
letter  :  'r'
misc    :  word_boundary
wspace  :  ' '
misc    :  word_boundary
letter  :  'b'
misc    :  word_boundary
char    :  '@'
misc    :  word_boundary
letter  :  'z'
misc    :  word_boundary
misc    :  end_of_string

当你执行re.search(r'\bfoo\b',str)时,最终成为pac-man遵循的一套规则,大致如下:

  1. 从头开始。
  2. 忽略一些事情,直到找到misc:word_boundary
  3. misc:word_boundary并记住您当前的位置为$ N。
  4. 尝试吃letter:'f'。如果你不能,吐出一切,前往$ N + 1,然后去规则#2。
  5. 尝试吃letter:'o'。如果你不能,吐出一切,前往$ N + 1,然后去规则#2。
  6. 尝试吃letter:'o'。如果你不能,吐出一切,前往$ N + 1,然后去规则#2。
  7. 尝试吃misc:'word_boundary'。如果你不能,吐出一切,前往$ N + 1,然后去规则#2。
  8. 告诉我你现在肚子里有什么。
  9. 显然,你可以在那里进行分层,例如使用循环(+*?)和速记(如\wa或{b {1}}或......“)或它如何有选择地忽略某些令牌,但希望揭示基本风格。

    所以...我现在可以解析HTML / XML吗?

    简短回答?不,Pac-man只能运行,但XML就像一棵树。吃豆人必须停在某些地方并聘请一些男人去探索他(用他们自己的不同的规则集)并报告回来。那些分包商也会有自己的分包商......

    无论如何,吃豆人的人的技能在生活在一个充满致命的鬼魂和提高性能的药物的不可避免的迷宫中发育不良。当你所能说的只是Wakka时,你不可能在Pac-Corp中走得很远。