还是我,再来问一个关于正则表达式的问题

2017-08-19 12:19:26 +08:00
 sqf3903

import re

p = re.compile(r'(\b\w+)\s+\1')

a = p.search('Paris in the the spring').group() print(a) 代码如上,执行结果是:the the 在 Python3 中使用原始字符串写正则表达式,\b 在这里我的理解是“单词”边界,也就是 Paris in the the spring 的开头和结尾位置,\w 是匹配任意 Unicode 单词字符,+是执行至少一次\w,然后再是匹配空白字符(\s 的意思),+是执行至少一次\s,\1 是再一次执行前面的所有匹配。 这里我想问的是为什么是从 the 开始匹配,而不是从 Paris 开始。 如果是从 the 开始,那结果为什么不是 “ the 空格 the 空格” 即 “ the the ” 而是“ the 空格 the ” 即 “ the the ”

2342 次点击
所在节点    Python
9 条回复
azh7138m
2017-08-19 12:28:06 +08:00
最后一个问题是因为,你写的是
(\b\w+)\s+\1
而不是
(\b\w+\s+)\1
所以是"the the"
ethanlu
2017-08-19 12:29:46 +08:00
整个正则是括号匹配到的在 s+之后再匹配一次,你字符串里面就只有 the 空格 the 符合。为什么不是 the 空格 the 空格,你把第一个右括号移到+s 后面应该就是了。
x18960
2017-08-19 12:35:32 +08:00
这个东西 你应该去菜鸟教程看看,我就在那里学的,这个叫反向引用
dallaslu
2017-08-19 12:50:35 +08:00
\b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter ),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b 并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置。

http://www.jb51.net/tools/zhengze.html
sqf3903
2017-08-19 13:24:18 +08:00
@azh7138m 多谢解惑,明白了!
sqf3903
2017-08-19 13:29:27 +08:00
@x18960 兄弟,给个链接吧
sqf3903
2017-08-19 13:30:55 +08:00
@dallaslu 等我缓过来再看,现在头有点大
x18960
2017-08-19 14:33:08 +08:00
@sqf3903 百度菜鸟教程 ro 什么的网址
code42
2017-08-20 15:31:35 +08:00
第一个问题:
你用的是 search,而不是 match

第二个问题:
反向引用之前匹配的(\b\w+)中不包含空格

直接 help(re)告诉你所有真相:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/384147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX