5

由于获得了我昨天遇到的问题的帮助 - Python 2.7 - 从文本文件中查找和替换,使用字典,到新的文本文件 - 我今天开始学习正则表达式以了解 @Blckknght 为其创建的正则表达式代码我在他的回答中。

但是,在我看来,python 文档(或更可能是我)在\b代码方面略有不正确。我在 python 文档中提到的关于 \b 的部分是这样的:

例如,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'打印到控制台,因为它匹配单词开头和结尾的空字符串。

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

编辑:我正在使用 python 2.7

4

1 回答 1

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. 告诉我你现在肚子里有什么。

显然,您可以在其中添加更多复杂性,例如使用循环 ( +*?) 和简写(例如\wfor " aor bor or cor ..."),或者它如何选择性地忽略某些标记,但希望能够揭示基本风格。

那么...我现在可以解析 HTML/XML 了吗?

简短的回答?不。吃豆人只对行进行操作,但 XML 就像一棵树。吃豆人必须在某些点停下来并雇用一些吃豆人为他探索(使用他们自己不同的规则)并报告回来。那些分包商也会有自己的分包商......

无论如何,吃豆人的人际交往能力在生活在一个充满致命鬼魂和提高成绩的药物的无法逃脱的迷宫中后受到阻碍。当您只能说 Wakka 时,您无法在 Pac-Corp 中走得很远。

于 2013-09-18T01:30:14.280 回答