在字符串处理中,正则表达式是一大利器,但其对于初学者而言是存在一定的难度的。
而如何匹配以xx开头以xx结尾的单词呢?
假设需要匹配的字符串为:site sea sue sweet see case sse ssee loses
需要匹配的为以s
开头以e
结尾的单词。
正确的正则式为:\bs\S*?e\b
无论什么语言的正则的格式都一样,下面以python为例来进行代码演示:
解释一下:在python中re.findall函数表示匹配字符串中所有的可能选项,findall()里面第一个r表示row,忽略正则式中所有的转义。
结果为:['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
写成.
,但是这就会导致另外一种情况,这种情况的输出为:
可以看见出现了sea sue
等不是我们所期望的情况出现。
而至于*
自然是表示匹配任意多个字符。
而使用\S*?
是为什么呢,为什么要加?
呢?这就涉及到正则表达式的懒惰模式了。
如果使用.*
表示的就是贪婪模式,而.*?
表示的就是懒惰模式。
贪婪模式下会尽量匹配最长的字符串,而懒惰模式会尽量匹配最短的字符串。
举个栗子:
对于字符串abcgabc
贪婪模式– a.*c
–得到的答案为:abcgabc
懒惰模式– a.*?c
–得到的答案为:abc
,abc
例子参考的是学习python的一个网站——Crossing的编程教室