Crossin的编程教室

标题: 56课课后习题 [打印本页]

作者: florence    时间: 2016-10-5 11:41
标题: 56课课后习题
答案是\bs\S*?e\b
应该是不用r的对吧

但是在我的运行中,r"\bs\S*?e\b"显示正确答案而“\bs\S*?e\b”显示no match
不应该r是使得后面的字符串无转义保持原样吗?
我是python3.5是否有不同?
作者: crossin先生    时间: 2016-10-5 21:21
不加r就被转义了啊,你把字符串print出来看有没有被转
作者: ebcfd    时间: 2016-11-25 23:02
我发现我也有同样的问题。。
作者: crossin先生    时间: 2016-11-26 14:23
ebcfd 发表于 2016-11-25 23:02
我发现我也有同样的问题。。

\b是会被转义的
  1. >>> print "\bs\S*?e\b"
  2. s\S*?e
复制代码

作者: delapi    时间: 2019-10-6 02:40
本帖最后由 delapi 于 2019-10-6 04:47 编辑

终于搞懂了,\bs\S*?e\b表示的是在文本中搜索一个回退符+s\S*?e+一个回退符,回退符\x08本身是占位置的,而不是我想的直接删除前面的字母

--------------------------------------------------------------------

我有点不太理解这个,如果说r"\bs\S*?e\b"这个正确可以理解,因为他先保证不转义,然后到正则表达时再转义。
可“\bs\S*?e\b”即便是在正则表达拿到规则前就转义了,可是用这个s\S*?e作为规则也不应该是no match啊(我试了m = re.findall(r's\S*?e', text)是可以搜到结果['site', 'se', 'sue', 'swe', 'se', 'se', 'sse', 'sse', 'se']的 )
我刚刚试了一下print(‘\bs\S*?e\b’)得到的并不是s\S*?e而是s\S*?(其实有点奇怪的是为什么S前面的反斜杠没有消去),我以为我搞懂了因为在正则表达之前转义\b会用python的规则当成回退符而非单词边界,可是按这个道理:
1.我在\b的前面随便输入一个新的字符(比如我试了‘a\bs\S*?ea\b'和‘\bs\S*?ea\b)应该就可以得到结果,但还是no match。
2.我试了m = re.findall(r's\S*?', text),也可以得到结果['s', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's', 's']而非no match
所以我现在确实被搞糊涂了
作者: crossin先生    时间: 2019-10-6 16:09
delapi 发表于 2019-10-6 02:40
终于搞懂了,\bs\S*?e\b表示的是在文本中搜索一个回退符+s\S*?e+一个回退符,回退符\x08本身是占位置的,而 ...

是的,就是你理解的这样




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5