天天看点

正则匹配以xx开头以xx结尾的单词

在字符串处理中,正则表达式是一大利器,但其对于初学者而言是存在一定的难度的。

而如何匹配以xx开头以xx结尾的单词呢?

假设需要匹配的字符串为:​

​site sea sue sweet see case sse ssee loses​

​​

需要匹配的为以​​

​s​

​​开头以​

​e​

​​ 结尾的单词。

正确的正则式为:​​

​\bs\S*?e\b​

无论什么语言的正则的格式都一样,下面以python为例来进行代码演示:

解释一下:在python中re.findall函数表示匹配字符串中所有的可能选项,findall()里面第一个r表示row,忽略正则式中所有的转义。

text ='site sea sue sweet see case sse ssee loses'
re.findall(r'\bs\S*?e\b',text)      

结果为:​

​['site', 'sue', 'see', 'sse', 'ssee']​

下面来解释一下:​

​\b​

​​ 代表单词的开始或结束,常由标点符号、空格、换行等来作为分隔符

如果前后不加​​

​\b​

​​,即正则表达式为:​

​s\S*?e​

​​

运行结果就变成了

​​

​['site', 'se', 'sue', 'swe', 'se', 'se', 'sse', 'sse', 'se']​

​​

这样匹配出来的就是不保证单词的完整性,只要某一个单词中含有s*e都会输出来。

​\S​

​​表示任意非空字符,在这个问题中很容易想到的正则表达式是​

​\bs.*?e\b​

​​ ,即将​

​\S​

​​ 写成​

​.​

​,但是这就会导致另外一种情况,这种情况的输出为:

['site', 'sea sue', 'sweet see', 'sse', 'ssee']      

可以看见出现了​

​sea sue​

​ 等不是我们所期望的情况出现。

而至于​

​*​

​​ 自然是表示匹配任意多个字符。

而使用​​

​\S*?​

​​ 是为什么呢,为什么要加​

​?​

​​ 呢?这就涉及到正则表达式的懒惰模式了。

如果使用​​

​.*​

​​ 表示的就是贪婪模式,而​

​.*?​

​​ 表示的就是懒惰模式。

贪婪模式下会尽量匹配最长的字符串,而懒惰模式会尽量匹配最短的字符串。

举个栗子:

对于字符串​​

​abcgabc​

贪婪模式– ​

​a.*c​

​​ –得到的答案为:​

​abcgabc​

​​

懒惰模式– ​​

​a.*?c​

​​ –得到的答案为:​

​abc​

​​,​

​abc​

例子参考的是学习python的一个网站——​​Crossing的编程教室​​