Python 高级编程之正则表达式(八)

news2024/10/1 9:21:31

文章目录

    • 一、概述
    • 二、正则表达式语法
      • 1)字符匹配
      • 2)字符集合
      • 3)定位符
      • 4)分组
        • 1、定义分组
        • 2、引用分组
        • 3、命名分组
    • 三、Python 的 re 模块
      • 1)re.match() 方法
      • 2)re.search() 方法
      • 3)re.match() 与 re.search() 的区别
      • 4)re.findall() 方法
      • 5)re.finditer() 方法
      • 6)re.sub() 方法
      • 7)re.compile() 方法
      • 8)re.split() 方法

一、概述

**正则表达式(Regular Expression)**是一种文本模式,用于匹配字符串中的模式。它可以用于很多任务,例如文本搜索和替换,数据提取,数据验证等。

  • 在 Python 中,可以使用 re 模块来支持正则表达式。正则表达式使用特殊的字符来表示不同的模式,例如 . 匹配任意字符,\d 匹配数字,^ 匹配字符串开头,$ 匹配字符串结尾等。

  • 通过使用正则表达式,可以很方便地对字符串进行匹配,搜索和替换等操作。使用正则表达式的时候,需要先编写一个匹配模式,然后使用 re 模块中的函数来执行实际的匹配操作。

总的来说,正则表达式是一种强大且高效的文本处理工具,可以用于解决很多实际问题。

在这里插入图片描述

二、正则表达式语法

正则表达式(Regular Expression,简称 regex 或 regexp)是一种用来匹配文本模式的工具,它可以用来搜索、替换和验证文本。正则表达式由一些特殊字符和普通字符组成,这些字符表示了一些模式。

下面是一些常见的正则表达式语法:

1)字符匹配

  • 普通字符:表示自身,例如 “a” 表示字符 a。
  • 元字符(特殊字符):表示某种特殊含义,例如 “.” 表示匹配任意字符,“\d” 表示匹配数字,“\w” 表示匹配字母、数字、下划线。

示例:

import re

# 匹配 "abc" 字符串
pattern = "abc"
text = "abc"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 3), match='abc'>

# 匹配任意字符
pattern = "."
text = "abc"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='a'>

# 匹配数字
pattern = "\d"
text = "123"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='1'>

# 匹配字母、数字、下划线
pattern = "\w"
text = "abc_123"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='a'>

2)字符集合

  • 方括号:表示匹配方括号中任意一个字符,例如 “[abc]” 表示匹配字符 a、b、c 中的任意一个。
  • 范围符号:表示匹配某个范围内的字符,例如 “[a-z]” 表示匹配小写字母 a 到 z 中的任意一个。
  • 量词:“”, “+”, “?”: 表示重复次数,“” 表示重复0次或多次,“+” 表示重复1次或多次,“?” 表示重复0次或1次。
  • "{m,n}": 表示重复次数的范围,例如 “{2,4}” 表示重复2到4次。

示例:

import re

# 匹配方括号中任意一个字符
pattern = "[abc]"
text = "a"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='a'>

# 匹配小写字母 a 到 z 中的任意一个
pattern = "[a-z]"
text = "a"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='a'>

# 重复0次或多次
pattern = "a*"
text = "aaa"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 3), match='aaa'>

# 重复1次或多次
pattern = "a+"
text = "aaa"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 3), match='aaa'>

# 重复0次或1次
pattern = "a?"
text = "aaa"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='a'>

# 重复2到4次
pattern = "a{2,4}"
text = "aaaa"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 4), match='aaaa'>

3)定位符

  • "^": 表示匹配开头。
  • "$": 表示匹配结尾。
  • "\b": 表示匹配单词边界。
import re

# 匹配开头
pattern = "^a"
text = "abc"
result = re.match(pattern, text)
print(result) # <re.Match object; span=(0, 1), match='a'>

# 匹配结尾
pattern = "c$"
text = "abc"
result = re.search(pattern, text)
print(result) # <re.Match object; span=(2, 3), match='c'>

# 匹配单词边界
pattern = r"\bcat\b"
text = "cat sat on the mat"
result = re.search(pattern, text)
print(result) # <re.Match object; span=(0, 3), match='cat'>

4)分组

  • "()", "(?:)": 表示分组,可以对一个子表达式进行分组。
  • "|": 表示或关系。

1、定义分组

使用圆括号 () 来定义分组,分组可以嵌套,每个分组都有一个唯一的编号,从左到右按照左括号的顺序编号。

import re
pattern = r"(\d{3})-(\d{4})-(\d{4})"
result = re.search(pattern, "Tel: 010-1234-5678")
print(result.group(0))  # 010-1234-5678
print(result.group(1))  # 010
print(result.group(2))  # 1234
print(result.group(3))  # 5678

2、引用分组

可以在正则表达式中使用 \n 引用第 n 个分组,其中 n 是分组的编号。

import re
pattern = r"(\w+) \1"
result = re.search(pattern, "hello hello world")
print(result.group(0))  # hello hello
print(result.group(1))  # hello

3、命名分组

除了使用编号引用分组,还可以使用 (?Ppattern) 语法给分组命名。

import re
pattern = r"(?P<first>\w+) (?P<last>\w+)"
result = re.search(pattern, "John Smith")
print(result.group(0))  # John Smith
print(result.group("first"))  # John
print(result.group("last"))  # Smith

以上仅是正则表达式语法的一部分,实际上正则表达式还包括很多高级的语法,比如反向引用、零宽度断言等。上面讲使用到了Python 的re模式,接下来细讲这个模块。

三、Python 的 re 模块

Python标准库中的re模块是用于正则表达式操作的模块,提供了正则表达式的编译、匹配、查找、替换等功能。下面是re模块的一些常用方法:

1)re.match() 方法

re.match() 函数从字符串的起始位置开始匹配正则表达式,如果匹配成功,就返回一个匹配对象。如果匹配不成功,就返回 None。

re.match() 的语法格式如下:

re.match(pattern, string, flags=0)

参数:

  • pattern 是正则表达式
  • string 是要匹配的字符串
  • flags 是可选参数,用于指定匹配模式。

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

修饰符描述
re.I使匹配对大小写不敏感
re.M多行匹配,影响 ^ 和 $
re.L做本地化识别(locale-aware)匹配
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

下面是一个简单的例子:

import re

pattern = r"hello"
string = "hello world"

match_obj = re.match(pattern, string)

if match_obj:
    print("匹配成功")
else:
    print("匹配失败")

在这个例子中,正则表达式 pattern 是 “hello”,要匹配的字符串是 “hello world”。由于正则表达式和字符串的开头都是 “hello”,所以匹配成功。

re.match() 返回的是一个匹配对象。如果匹配成功,可以使用匹配对象的方法和属性来获取匹配结果,如 group() 方法可以返回匹配的字符串,start() 和 end() 方法可以返回匹配的起始位置和结束位置,等等。如果匹配不成功,调用这些方法和属性会出现异常。

  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置

下面是一个获取匹配结果的例子:

import re

pattern = r"hello"
string = "hello world"

match_obj = re.match(pattern, string)

if match_obj:
    print("匹配成功")
    print(match_obj.group())     # hello
    print(match_obj.start())     # 0
    print(match_obj.end())       # 5
    print(match_obj.span())      # (0, 5)
else:
    print("匹配失败")

2)re.search() 方法

re.search() 方法在字符串中搜索正则表达式的第一个匹配项,并返回一个匹配对象。如果没有找到匹配项,就返回 None。

re.search() 的语法格式如下:

re.search(pattern, string, flags=0)

其中,pattern 是正则表达式,string 是要匹配的字符串,flags 是可选参数,用于指定匹配模式。匹配模式在上面有具体讲解。

下面是一个简单的例子:

import re

pattern = r"hello"
string = "world hello"

match_obj = re.search(pattern, string)

if match_obj:
    print("匹配成功")
else:
    print("匹配失败")

在这个例子中,正则表达式 pattern 是 “hello”,要匹配的字符串是 “world hello”。由于字符串中包含 “hello”,所以匹配成功。

3)re.match() 与 re.search() 的区别

Python re 模块中的 re.match()re.search() 方法都用于在字符串中查找匹配的模式。但是它们之间有一些区别。

  • re.match() 方法从字符串的起始位置开始匹配,如果起始位置不匹配,则返回 None。因此,re.match() 只能匹配到字符串的开头。
  • re.search() 方法在字符串中查找匹配的模式,可以匹配到字符串中任意位置的模式。

另外,两个方法返回的匹配对象也有一些区别:

  • re.match() 方法返回第一个匹配的对象,如果没有匹配到任何内容,则返回 None。
  • re.search() 方法返回第一个匹配的对象,如果没有匹配到任何内容,则返回 None。

如果要匹配整个字符串,通常建议使用 re.match() 方法;如果要匹配字符串中的一部分,或者不确定匹配的位置,通常建议使用 re.search() 方法。

下面是一个例子,展示了两个方法之间的区别:

import re

pattern = r"hello"
string = "world hello"

# 使用 re.match() 方法
match_obj = re.match(pattern, string)
if match_obj:
    print("re.match() 匹配成功")
    print(match_obj.group())   # 输出 "None"

# 使用 re.search() 方法
match_obj = re.search(pattern, string)
if match_obj:
    print("re.search() 匹配成功")
    print(match_obj.group())   # 输出 "hello"

在这个例子中,正则表达式 pattern 是 “hello”,要匹配的字符串是 “world hello”。由于字符串的开头不是 “hello”,所以 re.match() 方法无法匹配,返回 None;而 re.search() 方法可以在字符串中找到 “hello”,匹配成功。

4)re.findall() 方法

re.findall() 方法用于在字符串中查找正则表达式匹配的所有子串,并返回一个列表。如果没有匹配项,返回一个空列表。

re.findall() 方法的语法格式如下:

re.findall(pattern, string, flags=0)

其中,pattern 是正则表达式,string 是要匹配的字符串,flags 是可选参数,用于指定匹配模式。匹配模式在上面有具体讲解。

下面是一个简单的例子:

import re

pattern = r"\d+"
string = "2 apples, 5 bananas, 1 orange"

result = re.findall(pattern, string)

print(result)   # ['2', '5', '1']

在这个例子中,正则表达式 pattern 是 “\d+”,要匹配的字符串是 “2 apples, 5 bananas, 1 orange”。“\d+” 表示匹配一个或多个数字,所以返回的结果是一个包含所有数字的列表。

【注意】re.findall() 方法返回的是一个字符串列表,其中的每个字符串都是一个匹配的子串。如果正则表达式包含分组,返回的列表将包含所有分组匹配的字符串。

5)re.finditer() 方法

re.finditer() 方法与 re.findall() 方法类似,都可以在字符串中使用正则表达式进行匹配,但它返回的不是一个列表,而是一个迭代器,可以通过迭代器逐个访问匹配结果。

re.finditer() 方法的语法格式如下:

re.finditer(pattern, string, flags=0)

其中,pattern 是正则表达式,string 是要匹配的字符串,flags 是可选参数,用于指定匹配模式。

下面是一个简单的例子:

import re

pattern = r"\d+"
string = "2 apples, 5 bananas, 1 orange"

result = re.finditer(pattern, string)

for match in result:
    print(match.group())

在这个例子中,正则表达式 pattern 是 “\d+”,要匹配的字符串是 “2 apples, 5 bananas, 1 orange”。使用 re.finditer() 方法进行匹配,返回的结果是一个迭代器,可以通过 for 循环逐个访问匹配结果。每个匹配结果都是一个 Match 对象,可以使用 match.group() 方法获取匹配的内容。

re.finditer() 方法与 re.findall() 方法的区别在于,re.findall() 方法返回一个包含所有匹配结果的列表,而 re.finditer() 方法返回一个迭代器,可以逐个访问匹配结果,这在处理大量数据时可以节省内存。

6)re.sub() 方法

re.sub() 方法用于在字符串中查找正则表达式匹配的子串,并将其替换为指定的字符串。re.sub() 方法返回替换后的字符串。

re.sub() 方法的语法格式如下:

re.sub(pattern, repl, string, count=0, flags=0)

其中,pattern 是正则表达式,repl 是替换字符串,string 是要进行替换的字符串,count 是可选参数,用于指定最多替换的次数,flags 是可选参数,用于指定匹配模式。

下面是一个简单的例子:

import re

pattern = r"\s+"
string = "hello  world"

result = re.sub(pattern, "-", string)

print(result)   # 'hello-world'

在这个例子中,正则表达式 pattern 是 “\s+”,要匹配的字符串是 “hello world”,“\s+” 表示匹配一个或多个空格。repl 参数是 “-”,表示将匹配到的空格替换为 “-”,结果返回的是 “hello-world”。

【注意】re.sub() 方法并不会改变原始的字符串,而是返回一个新的字符串。如果想要在原始字符串中进行替换,可以将结果赋值给原始字符串变量。

7)re.compile() 方法

re.compile() 方法用于将正则表达式编译为一个模式对象,该模式对象可以用于匹配字符串。

re.compile() 方法的语法格式如下:

re.compile(pattern, flags=0)

其中,pattern 是要编译的正则表达式,flags 是可选参数,用于指定匹配模式。

编译后的模式对象可以调用 match()、search()、findall() 和 sub() 等方法进行匹配和替换操作。使用 re.compile() 方法编译正则表达式可以提高多次使用同一模式的效率。

下面是一个简单的例子:

import re

pattern = r"\d+"
string = "2 apples, 5 bananas, 1 orange"

regex = re.compile(pattern)
result = regex.findall(string)

print(result)   # ['2', '5', '1']

在这个例子中,正则表达式 pattern 是 “\d+”,要匹配的字符串是 “2 apples, 5 bananas, 1 orange”。使用 re.compile() 方法将正则表达式编译为一个模式对象 regex,然后调用 regex.findall() 方法进行匹配,返回的结果是一个包含所有数字的列表。

【注意】如果要使用编译后的正则表达式进行匹配,必须调用相应的模式对象的方法。如果直接在 re 模块中使用正则表达式,Python 会自动将其编译为一个模式对象。

8)re.split() 方法

re.split() 方法用于在字符串中使用正则表达式进行分割,并返回一个列表

re.split() 方法的语法格式如下:

re.split(pattern, string, maxsplit=0, flags=0)

其中,pattern 是正则表达式,string 是要分割的字符串,maxsplit 是可选参数,用于指定最大分割次数,flags 是可选参数,用于指定匹配模式。

下面是一个简单的例子:

import re

pattern = r"\s+"
string = "hello  world"

result = re.split(pattern, string)

print(result)   # ['hello', 'world']

在这个例子中,正则表达式 pattern 是 “\s+”,要分割的字符串是 “hello world”,“\s+” 表示匹配一个或多个空格。re.split() 方法将字符串按照正则表达式进行分割,并返回一个列表,列表中的每个元素都是分割后的子串。

【注意】re.split() 方法不会在分割后的字符串中保留分割符,如果想要保留分割符,可以使用分组语法,例如:

import re

pattern = r"(\s+)"
string = "hello  world"

result = re.split(pattern, string)

print(result)   # ['hello', '  ', 'world']

在这个例子中,正则表达式 pattern 是 “(\s+)”,使用圆括号将 “\s+” 包含起来,表示将空格作为分组进行匹配,re.split() 方法会保留分组匹配的内容。返回的结果是一个列表,列表中的元素是分割后的子串和分组匹配的内容。


Python 的正则表达式常用的语法和方法就先讲解到这里了,更关键还是需要多使用加深印象的。有任何疑问的小伙伴欢迎给我留言哦,后续会持续更新相关技术文章,也可关注我的公众号【大数据与云原生技术分享】进行深入技术交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最牛教程,手把手教你成为年薪30W的测试开发

随着互联网行业的高速发展&#xff0c;快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求&#xff0c;而在短期迭代的快节奏中&#xff0c;传统测试工作面对更大压力&#xff0c;无法持续提供高效率高质量的人力支撑&#xff0c;所以越来越多的企业需要技术更为全面…

Leetcode-每日一题1250. 检查「好数组」(裴蜀定理)

题目链接&#xff1a;https://leetcode.cn/problems/check-if-it-is-a-good-array/description/ 思路 方法&#xff1a;数论 题目意思很简单&#xff0c;让你在数组 nums中选取一些子集&#xff0c;可以不连续&#xff0c;子集中的每个数再乘以任意的数的和是否为1&#xff…

netty

Netty的介绍Netty是异步的&#xff08;指定回调处理&#xff09;、基于事件驱动的网络应用框架&#xff0c;用于快速开发高性能、高可靠性的网络IO程序。Netty本质是一个NIO框架&#xff0c;适用于服务器通讯相关的多种应用场景&#xff0c;分布式节点远程调用中Netty往往作为R…

RTT 消息邮箱

1.邮箱概念 邮箱服务是实时操作系统中一种典型的线程间通信方法。举一个简单的例子&#xff0c;有两个线程&#xff0c;线程 1 检测按键状态并发送&#xff0c;线程 2 读取按键状态并根据按键的状态相应地改变 LED 的亮灭。这里就可以使用邮箱的方式进行通信&#xff0c;线程 …

SpringCloud保姆级搭建教程五---Redis

首先&#xff0c;这个和微服务没有直接的关系&#xff0c;只是在代码开发当中要使用的一个工具而已&#xff0c;为了提高这个系统的性能&#xff0c;加快查询效率等方面而使用它1、首先&#xff0c;要先安装redis到电脑上&#xff0c;这里依然是在windows上演示&#xff0c;之后…

window11, WSL, Ubuntu 20.04 编译TensorRT源码并且安装 TensorRT

一、安装参考 1.ubuntu18.04TensorRT 配置攻略 ubuntu18.04TensorRT 配置攻略 - 简书卷积网络的量化和部署是重要环节&#xff0c;以前我们训练好模型后直接trace进行调用&#xff0c;参考&#xff08;C windows调用ubuntu训练的PyTorch模型&#xff08;.pt/.pth&#xff09;…

Utkuici:一款功能强大的Nessus自动化任务实现工具

关于Utkuici 今天&#xff0c;随着信息技术系统的普及&#xff0c;网络安全领域的投资已大幅增加。各种规模的组织都需要进行漏洞管理、渗透测试和各种分析&#xff0c;以准确确定各自机构受网络威胁的影响程度。通过借助漏洞管理工具的行业领先者Tenable Nessus&#xff0c;我…

若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】

昨天情人节一(&#xffe3;︶&#xffe3;*)) 送给赛利亚一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面&#xff1a; 干干净净贼舒服一Ψ(&#xffe3;∀&#xffe3;)Ψ——Ψ(&#xffe3;∀&#x…

Vue一个项目兼容每个省份的个性化需求

开发环境及打包指令 后拼上省份区划"serve:henan": "yarn && vue-cli-service serve -o --encryptSM2 --zone41","serve:hunan": "yarn && vue-cli-service serve -o --encryptSM2 --zone43","serve:guizhou&quo…

电子技术——多阶放大器

电子技术——多阶放大器 实际上的商用放大器是由多个单阶放大器联级而成的多阶放大器。首先第一阶&#xff08;输入&#xff09;通常提供一个较大的输出阻抗来保证较小的信号衰减。若是差分放大器&#xff0c;还要保证有较大的共模抑制比。中间各阶放大器负责提供电压增益&…

wireshark在流媒体分析中常见操作

Wireshark Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。 在流媒体相关工作中&am…

学英语的优势已来,抓住这个机会

文 / 冰雪&#xff08;微信公众号&#xff1a;王不留&#xff09; ChatGPT大火&#xff0c;国外的商业价值还没找到&#xff0c;咱们这边已经开始变现了。谷雨小姐姐昨天在”一起学英语”微信群发了一张“收割韭菜”的文案截图。 299入社群&#xff0c;服务内容为&#xff1a;免…

卷严重、难度高、激励少,如何适应空投市场新变化

自从空投交互从2020年开始之后&#xff0c;不少人都开始加入到空投交互的行列中&#xff0c;一些项目也因为“格局”的因素&#xff0c;在项目正式上线前都会给早期参与者空投代币&#xff0c;以此吸引大家的关注。但是在越来越多的人加入到撸空投行列之中后&#xff0c;现在整…

javaEE 初阶 — 流量控制与拥塞控制

文章目录1. 流量控制2. 拥塞控制TCP 工作机制&#xff1a;确认应答机制 超时重传机制 连接管理机制 滑动窗口 1. 流量控制 流量控制是一种干扰发送的窗口大小的机制&#xff0c;滑动窗口&#xff0c;窗口越大&#xff0c;传输的效率就越高&#xff08;一份时间&#xff0c;…

Gromacs中的g_mmpbsa计算带电底物与蛋白的结合能不准确

g_mmpbsa计算带电底物与蛋白的结合能总是不准确 TOC 在做的两个项目中&#xff0c;利用g_mmpbsa计算带电底物与蛋白的结合能结果非常不可靠&#xff0c;底物带两个硫酸根离子&#xff0c;g_mmpbsa在计算带电的底物与酶的结合能时总是不准确&#xff0c;因此后续若底物带电&…

三层交换机DHCP中继

关于中继&#xff0c;我们需要有一个对比。正常情况下我们是不是需要配置单臂路由然后开启DHCP地址池&#xff0c;然就设置网段网关以及DNS。这样的话考验 的其实是命令功底。但是为了方便&#xff0c;我们 可以添加服务器&#xff0c;将这个服务给到服务器去配置&#xff0c;这…

为什么sleeping的会话会造成阻塞(2)

背景客户反馈系统突然从11:10开始运行非常缓慢&#xff0c;在SQL专家云中看到大量的产生阻塞的活动会话&#xff0c;KILL掉阻塞的源头马上又出现新的源头&#xff0c;实在没有办法只能重启应用程序断开所有数据库连接才解决&#xff0c;请我们协助分析根本的原因。现象登录SQL专…

Web前端CSS清除浮动的5种方法

在移动端清除浮动布局&#xff0c;常用的5种方法&#xff1a; 使用清除浮动的类&#xff1b;使用overflow属性&#xff1b;使用 flex 布局&#xff1b;使用grid 布局&#xff1b;使用 table 布局。 根据实际情况选择适合的方法&#xff0c;需要注意兼容性和语义性问题。在移动…

Yolo v5 pytorch模型转onnx用c++进行推理

本文介绍如何使用u版的yolov5 模型转成 onnx模型&#xff0c;使用python代码推理onnx模型&#xff0c;然后再使用c代码推理onnx模型,本文使用yolov5 s版本&#xff0c;在m,l,x都试过可行环境配置 :1 u版的yolov5 4.0 版本&#xff0c;其他版本没有试过 https://github.com/ultr…

console调试,chrome调试工具之Console

背景 console作为web调试的一项重要技能大多数开发人员都是console.log()一把梭到底&#xff0c;其实console对象上还有很多可用于调试的方法 控制台打印类别&#xff0c;conso调试面板 第一个是全部消息&#xff0c;第二个是自己在控制台里使用console指令打印的&#xff0…