zoukankan      html  css  js  c++  java
  • 正则匹配以xx开头以xx结尾的单词

    在字符串处理中,正则表达式是一大利器,但其对于初学者而言是存在一定的难度的。
    而如何匹配以xx开头以xx结尾的单词呢?

    假设需要匹配的字符串为:site sea sue sweet see case sse ssee loses
    需要匹配的为以s开头以e 结尾的单词。
    正确的正则式为:sS*?e

    无论什么语言的正则的格式都一样,下面以python为例来进行代码演示:
    解释一下:在python中re.findall函数表示匹配字符串中所有的可能选项,findall()里面第一个r表示row,忽略正则式中所有的转义。

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

    结果为:['site', 'sue', 'see', 'sse', 'ssee']

    下面来解释一下: 代表单词的开始或结束,常由标点符号、空格、换行等来作为分隔符
    如果前后不加,即正则表达式为:sS*?e
    运行结果就变成了
    ['site', 'se', 'sue', 'swe', 'se', 'se', 'sse', 'sse', 'se']
    这样匹配出来的就是不保证单词的完整性,只要某一个单词中含有s*e都会输出来。

    S表示任意非空字符,在这个问题中很容易想到的正则表达式是s.*?e ,即将S 写成.,但是这就会导致另外一种情况,这种情况的输出为:

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

    可以看见出现了sea sue 等不是我们所期望的情况出现。

    而至于* 自然是表示匹配任意多个字符。
    而使用S*? 是为什么呢,为什么要加 呢?这就涉及到正则表达式的懒惰模式了。
    如果使用.* 表示的就是贪婪模式,而.*? 表示的就是懒惰模式。
    贪婪模式下会尽量匹配最长的字符串,而懒惰模式会尽量匹配最短的字符串。
    举个栗子:
    对于字符串abcgabc

    贪婪模式– a.*c –得到的答案为:abcgabc
    懒惰模式– a.*?c –得到的答案为:abc,abc

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



    欢迎大家加入QQ群一起交流讨论,「吟游」程序人生——YinyouPoet

  • 相关阅读:
    236. 二叉树的最近公共祖先
    230. 二叉搜索树中第K小的元素
    221. 最大正方形
    软件构建模式之MVC框架初窥
    九度OnlineJudge之1020:最小长方形
    九度OnlineJudge之1018:统计同成绩学生人数
    九度OnlineJudge之1017:还是畅通工程
    向Python女神推荐这些年我追过的经典书籍
    最实用的10个重构小技巧排行榜,您都用过哪些呢?
    九度OnlineJudge之1014:排名
  • 原文地址:https://www.cnblogs.com/yinyoupoet/p/13287551.html
Copyright © 2011-2022 走看看