前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【打卡贴】(No.010) 正则表达式匹配

【打卡贴】(No.010) 正则表达式匹配

作者头像
PM小王
发布2019-07-02 15:23:29
4070
发布2019-07-02 15:23:29
举报
文章被收录于专栏:程序员小王

NO.10 正则表达式匹配

原题:

给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.''*' 的正则表达式匹配。

代码语言:javascript
复制
'.' 匹配任意单个字符。
'*' 匹配零个或多个前面的元素。

匹配应该覆盖整个字符串 (s) ,而不是部分字符串。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 .*

示例 1:

代码语言:javascript
复制
输入:s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

代码语言:javascript
复制
输入:s = "aa"
p = "a*"
输出: true
解释: 
'*' 代表可匹配零个或多个前面的元素, 
即可以匹配 'a' 。
因此, 重复 'a' 一次, 字符串可变为 "aa"。

示例 3:

代码语言:javascript
复制
输入:s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')
任意字符('.')。

示例 4:

代码语言:javascript
复制
输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 
'c' 可以不被重复, 
'a' 可以被重复一次。因此可以匹配字符串 "aab"。

示例 5:

代码语言:javascript
复制
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false

看到题目是蒙逼的,自己正则表达式学的很渣(从未认真学习过)因为之前学习和开发很少用到,出来混总是要还的,所以先恶补了一波正则,然后再刷题。


一、简介

正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序猿可以直接调用来实现正则匹配。

二、正则表达式中常用的字符含义

普通字符

匹配自身

abc

abc

.

匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符

a.c

abc

\

转义字符,使后一个字符改变原来的意思

a\.c;a\\c

a.c;a\c

*

匹配前一个字符0或多次

abc*

ab;abccc

+

匹配前一个字符1次或无限次

abc+

abc;abccc

?

匹配一个字符0次或1次

abc?

ab;abc

^

匹配字符串开头。在多行模式中匹配每一行的开头

^abc

abc

$

匹配字符串末尾,在多行模式中匹配每一行的末尾

abc$

abc

|

或。匹配|左右表达式任意一个,从左到右匹配,如果|没有包括在()中,则它的范围是整个正则表达式

abc|def

abcdef

{}

{m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次

ab{1,2}c

abcabbc

[]

字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。

a[bcd]e

abeaceade

()

被括起来的表达式将作为分组,从表达式左边开始没遇到一个分组的左括号“(”,编号+1.分组表达式作为一个整体,可以后接数量词。表达式中的|仅在该组中有效。

(abc){2}a(123|456)c

abcabca456c

注:

  • 反斜杠后边跟元字符去除特殊功能;(即将特殊字符转义成普通字符)
  • 反斜杠后边跟普通字符实现特殊功能;(即预定义字符)
  • 引用序号对应的字组所匹配的字符串。

三、re模块中常用功能函数

match() 匹配string 开头,成功返回Match object, 失败返回None,只匹配一个。

search() 在string中进行搜索,成功返回Match object, 失败返回None, 只匹配一个。

findall() 在string中查找所有 匹配成功的组, 即用括号括起来的部分。返回list对象,每个list item是由每个匹配的所有组组成的list。

finditer() 在string中查找所有 匹配成功的字符串, 返回iterator,每个item是一个Match object。

group() 是将所有匹配符合条件的字符串,打包成一个组,即group。其中编号为0的group,即group(0)表示匹配的整个字符串。其他编号分别为1,2,3,…的表示匹配成功返回的组中的每个字符串。

split()

按照能够匹配的子串将string分割后返回列表。

可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。

注:re.match与re.search与re.findall的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

(菜鸟教程正则表达式传送门)

http://www.runoob.com/python3/python3-reg-expressions.html


解题:

代码语言:javascript
复制
import re
class Solution(object):
    def isMatch(self, s, p):
        ans = (re.match(p, s))
        if (ans == None):
            return False
        if (ans.group(0) != s):
            return False
        return True
s = Solution()
print(s.isMatch("ab", ".*c"))

这个题可以不用re模块,但是以自己现在的知识储备没有任何思路,LeetCode刷题已经到了第10题了,这算是前十题里面最难的了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 看到题目是蒙逼的,自己正则表达式学的很渣(从未认真学习过)因为之前学习和开发很少用到,出来混总是要还的,所以先恶补了一波正则,然后再刷题。
  • 一、简介
  • 二、正则表达式中常用的字符含义
  • 三、re模块中常用功能函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档