python . 模式匹配与正则表达式

    在周五晚上,学习了一波 python 的 正则表达式的使用,下面是我的一些总结:

一、正则表达式的优势

    如果我们没有使用正则表达式,如果我们想要在某个文本中查找某个字符串,例如"394-123-2445" 这类的电话号码,我们需要如下代码:

def isPhoneNumber(text):
    if len(text) != 12:
        return False
    for i in range(0, 3):
        if not text[i].isdecimal():
            return False
    if text[3] != '-':
        return False
    for i in range(4, 7):
        if not text[i].isdecimal():
            return False
    if text[7] != '-':
        return False
    for i in range(8, 12):
        if not text[i].isdecimal():
            return False
return True

而使用正则表达式:

phoneRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
mo = phoneRegex.search("myhone is 234-456-12345")

相比之下,正则表达式的使用则非常的简洁。

二、python 的正则表达式的使用

    (1)创建正则表达式对象

            regex = re.compile('\d\d\d'), 使用 re.compilte()编译一个正则表达式字符串。

    (2)匹配 Regex 对象

            mo = regex.search("my num : 123"), 把要查找的文本字符串传入 search() 返回,返回一个 Match 对象。

    (3)返回匹配到的字符串

            str = mo.group()。调用  Math 对象的 group() 对象返回匹配到的字符串

三、正则表达式的书写

     (1) 精确匹配某个字符

        str = 'abcd', 这种字符串会精确的匹配 abcd 字符串

   (2)匹配任意字符

        使用 '.' 符号来任意的一个字符

    (3)是否匹配某个字符

        使用 '?' 可以保证某个字符可以出现或者不出现。比如 str = 'a?' ,a 字符可以有或者没有

    (4)匹配零次或者多次

        使用 * 号,可以匹配出现零次或多次

    (5)匹配一次或者多次

         使用 + 号,可以匹配出现一次或多次

     (6)可以指定匹配多少次

        使用花括号可以指定匹配多少次,比如 regex = re.compile(r'a{2,4}'), 可以匹配 a 出现 2次到4次的字符串


四、python 内置的表示某类字符的表达式

      \d                0-9 的任何数字

      \D                除了 0-9 的数字以外的任何字符

      \w                任何字母、数字或下划线字符

      \W                除字母、数字和下划线以外的任何字符

      \s                空格、制表符或换行符

      \S                除空格、制表符和换行符以外的任何字符


五、re 的一些常量

    查看 re.compile("\d\d", flag=0) flag 的一些常量值如下

    re.I 或者 re.IGNORECASE 

        执行不区分大小写的匹配,表达式[A-Z] 将匹配小写字母

    re.M 或者 re.MULTILINE

        指定时,模式字符'^'匹配字符串的开头和每行的开头(紧跟在每个换行符后面); 并且模式字符'$'匹配字符串的末尾和每行末尾(紧接在每个换行符之前)。默认情况下,'^' 只匹配字符串的开始位置,并且'$'匹配字符串的末尾和匹配字符串末尾的换行符(如果有)。对应于内联标志(?m)

    re.X 或者 re.VERBOSE

        该标志允许您编写正则表达式,通过允许您在视觉上分离模式的逻辑部分并添加注释,该正则表达式看起来更好,并且更易读。在该模式内的空白被忽略,当在字符类,或当由反斜杠之后除,或令牌内的类似*?(?:(?P<...>当一行包含一个#不在字符类中并且没有非转义反斜杠#的行时,最左边的所有字符 都将被忽略。

    re.S 或者 re.DOTALL

    使'.'特殊字符匹配任何字符,包括换行符; 没有这个标志,'.'将会匹配换行符之外任何内容对应于内联标志(?s)

六、符号表达式的总结:

  • ?匹配零次或一次前面的分组。

  • *匹配零次或多次前面的分组。

  • +匹配一次或多次前面的分组。

  • {n}匹配 次前面的分组。

  • {n,}匹配 次或更多前面的分组。

  • {,m}匹配零次到 次前面的分组。

  • {n,m}匹配至少 次、至多 次前面的分组。

  • {n,m}?*?+?对前面的分组进行非贪心匹配。

  • ^spam 意味着字符串必须以 spam 开始。

  • spam$意味着字符串必须以 spam 结束。

  • .匹配所有字符,换行符除外。

  • \d\w \s 分别匹配数字、单词和空格。

  •  \D\W \S 分别匹配出数字、单词和空格外的所有字符。

  •  [abc]匹配方括号内的任意字符(诸如 a或 c)。

  • [^abc]匹配不在方括号内的任意字符。


猜你喜欢

转载自blog.csdn.net/gochenguowei/article/details/80790221