正则匹配个人易忽略点记录

标志/模式修正符

多行修饰符(Multline)

与($,^)这两个检查首尾的符号紧密相关,注意点:在默认情况下,它们是默认检查全局,即所有字符的开头和结尾,即使你使用了换行符号,它也不会对首位进行检查。
例如表达式: /.at(.)?$/gm 表示小写字符a后跟小写字符t,末尾可选除换行符外任意字符

1
2
3
"/.at(.)?$/" => The fat
cat sat
on the mat.

这里只匹配mat
但是:

1
2
3
"/.at(.)?$/gm" => The fat
cat sat
on the mat.

这里就会把fat,sat,mat都给匹配上

总结:

重点就是:m加上后会在每排匹配,没有m只会在全局看尾巴或者开头有没有目标字符。

关于点运算符(.)

  • 本质:就是随意匹配一个字符,包括空格符但是不匹配换行符

  • 理解:以下例子:’

  • 三者进行对比:

    1
    2
    3
    4
    5
    import re

    """关于findall以及点运算符的使用"""
    result = re.findall(r".", "The car parked in the garage.")
    print(result)
    • 这时会输出

    • ['T', 'h', 'e', ' ', 'c', 'a', 'r', ' ', 'p', 'a', 'r', 'k', 'e', 'd', ' ', 'i', 'n', ' ', 't', 'h', 'e', ' ', 'g', 'a', 'r', 'a', 'g', 'e', '.']
      
      1
      2
      3
      4
      5
      6
      7
      8
      9

      * 即匹配所有字符,除了换行符。

      ```python
      import re

      """关于findall以及点运算符的使用"""
      result = re.findall(r".ar", "The car parked in the garage.")
      print(result)
    • 这时会输出

    • ['car', 'par', 'gar']
      
      1
      2
      3
      4
      5
      6
      7
      8
      9

      * 即加权对字符进行匹配,匹配后面跟着`ar`字符的单词

      ```python
      import re

      """关于findall以及点运算符的使用"""
      result = re.findall(r".*", "The car parked in the garage ar.")
      print(result)
    • 这时会输出

    • ['The car parked in the garage ar.', '']
      
    • 这里我们就要提到贪婪匹配了!

贪婪匹配和非贪婪匹配的区别

入门:个人通俗理解

  • 其实贪婪匹配就是尽可能地多匹配字符,而非贪婪匹配就是匹配到第一个符合条件的字符后收手,计为一个匹配的对象,不再匹配。

  • 参考网站:正则匹配模拟器

  • 比如.* 就是对字符进行贪婪匹配,将该表达式写作:.*?就是非贪婪匹配,即懒惰匹配

    详见如下的例子:

  • 例一:

  • 贪婪匹配的格式就为,表达式.+首尾为匹配的表达式模板,比如这个例子,首位就是a,结尾就为b[空格]a,那就匹配首位格式为这样的字符传,如图所示,就算把中间数个b中该有c字符的话,一样可以匹配,比如:

  • 例二:

  • 这里可以发现,当我使用?将贪婪匹配转为懒惰匹配后,在第一个格式为a开头,b结尾的字符串处匹配就结束了

  • 不会像如下这样: