我实际上希望 '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 遵循的一套规则,大致如下:
- 从头开始。
- 在找到
misc:word_boundary
.
- 吃掉
misc:word_boundary
并记住你当前的位置为$N。
- 尝试吃一个
letter:'f'
。如果你做不到,就把所有的东西都吐出来,去$N+1,然后去规则#2。
- 尝试吃一个
letter:'o'
。如果你做不到,就把所有的东西都吐出来,去$N+1,然后去规则#2。
- 尝试吃一个
letter:'o'
。如果你做不到,就把所有的东西都吐出来,去$N+1,然后去规则#2。
- 尝试吃一个
misc:'word_boundary'
。如果你做不到,就把所有的东西都吐出来,去$N+1,然后去规则#2。
- 告诉我你现在肚子里有什么。
显然,您可以在其中添加更多复杂性,例如使用循环 ( +*?
) 和简写(例如\w
for " a
or b
or or c
or ..."),或者它如何选择性地忽略某些标记,但希望能够揭示基本风格。
那么...我现在可以解析 HTML/XML 了吗?
简短的回答?不。吃豆人只对行进行操作,但 XML 就像一棵树。吃豆人必须在某些点停下来并雇用一些吃豆人为他探索(使用他们自己不同的规则)并报告回来。那些分包商也会有自己的分包商......
无论如何,吃豆人的人际交往能力在生活在一个充满致命鬼魂和提高成绩的药物的无法逃脱的迷宫中后受到阻碍。当您只能说 Wakka 时,您无法在 Pac-Corp 中走得很远。