在周五晚上,学习了一波 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 次前面的分组。
  • {n,}匹配 n 次或更多前面的分组。
  • {,m}匹配零次到 m 次前面的分组。
  • {n,m}匹配至少 n 次、至多 m 次前面的分组。
  • {n,m}?或*?或+?对前面的分组进行非贪心匹配。
  • ^spam 意味着字符串必须以 spam 开始。
  • spam$意味着字符串必须以 spam 结束。
  • .匹配所有字符,换行符除外。
  • \d、\w 和\s 分别匹配数字、单词和空格。
  •  \D、\W 和\S 分别匹配出数字、单词和空格外的所有字符。
  •  [abc]匹配方括号内的任意字符(诸如 a、b 或 c)。
  • [^abc]匹配不在方括号内的任意字符。