news 2026/8/16 7:59:38

Python正则表达式实战:字符串精准清洗与字符类型提取指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python正则表达式实战:字符串精准清洗与字符类型提取指南

1. 项目概述:字符串处理的“瑞士军刀”

在数据处理、文本清洗、信息抽取这些日常开发场景里,字符串处理绝对是Python程序员绕不开的基本功。你可能经常遇到这样的需求:从一段混杂着中英文、数字、标点符号和空格的用户输入里,只提取出手机号码;或者,在分析社交媒体评论时,需要过滤掉所有的表情符号和特殊字符,只保留纯文本内容;又或者,在数据入库前,必须确保某个字段只包含中文字符。这些看似简单的“去除”或“保留”操作,如果手动用循环和条件判断去写,不仅代码冗长,而且容易出错,效率也低。

这个项目要解决的,正是这个高频痛点。它不是一个具体的软件,而是一套高度模块化、即拿即用的字符串处理函数集合,核心目标是通过Python,特别是其强大的re(正则表达式)库,精准地实现对字符串中特定字符类别(数字、中文、英文、标点符号、空格)的“外科手术式”操作。无论是想一键清除所有非数字字符,还是只想保留中文和标点,你都能在这里找到对应的“工具”。这就像给你的代码工具箱里添置了一套专门处理字符串的“瑞士军刀”,每把“刀”都针对一种特定的字符类型,用起来又快又准。

这套工具特别适合数据分析师、爬虫工程师、后端开发以及任何需要做文本预处理的同学。即使你正则表达式玩得还不熟,没关系,这里提供的函数都是封装好的,你只需要知道你想“要什么”或“不要什么”,直接调用函数就行。接下来,我会带你从设计思路开始,一步步拆解如何构建这套工具,并分享在实际使用中积累的实战经验和避坑指南。

2. 核心思路与字符集定义

在动手写代码之前,我们必须先搞清楚一个根本问题:在计算机的世界里,我们如何精确地定义“数字”、“中文”、“英文”这些概念?答案就藏在Unicode编码标准和正则表达式的字符类里。

2.1 理解Unicode与正则字符集

计算机存储的所有字符都有一个唯一的数字编号,这就是Unicode码点。正则表达式允许我们使用特定的元字符或序列来匹配某一类字符。我们的核心思路,就是为每一类字符构造一个精确的正则表达式模式(pattern),然后通过re.sub()函数进行替换操作。re.sub(pattern, repl, string)的作用是:在string中查找所有匹配pattern的部分,并将其替换为repl(替换字符串)。如果我们的目的是“去除”,那么repl就设为空字符串'';如果目的是“保留”,逻辑就需要反过来——我们需要匹配“我们不想要”的字符,然后将其删除,从而间接“保留”我们想要的。

2.2 关键字符集的正则定义

下面这个表格是我们这套工具的基石,它定义了每一类字符对应的正则表达式模式。理解它们,你就能自己定制任何规则。

字符类别正则表达式模式说明与Unicode范围
数字r'\d'\d匹配任何十进制数字,等价于[0-9]。这是最常用、最简单的。
英文字母r'[a-zA-Z]'匹配所有大写和小写的英文字母。注意这里不包含数字和标点。
中文字符r'[\u4e00-\u9fff]'匹配基本的中文汉字。范围\u4e00\u9fff覆盖了CJK统一表意文字的大部分。对于更全的覆盖(如扩展区),可以使用r'[\u4e00-\u9fff\u3400-\u4dbf\U00020000-\U0002A6DF]',但绝大多数场景基本范围已足够。
标点符号r'[^\w\s]'或自定义集合\w匹配单词字符(字母、数字、下划线),\s匹配空白字符。[^\w\s]即匹配既不是单词字符也不是空白字符的字符,这通常就是标点。但注意,它可能包含一些你不认为是标点的特殊符号。更精确的做法是列举常见中英文标点,如 `r'[,。!?;:“”‘’、()【】《》…—~!@#$%^&*()_+-=[]{}
空格r'\s'\s匹配任何空白字符,包括空格、制表符(\t)、换行符(\n)、回车符(\r)等。如果只想匹配普通空格,直接用' '

注意:上表中用于匹配中文的Unicode范围\u4e00-\u9fff是一个需要牢记的核心点。它代表了在Unicode编码表中,分配给常用汉字的连续区块。当你看到\u后面跟4个十六进制数字,它就是在指定一个具体的Unicode字符。

2.3 设计模式:去除 vs. 保留

有了字符集定义,我们就可以设计两种基本操作模式:

  1. 去除模式:直接匹配目标字符集,并将其替换为空。例如,去除所有数字:re.sub(r'\d', '', text)
  2. 保留模式:逻辑上更绕一点。我们需要匹配“除了目标字符集之外的所有字符”,然后将其删除。这可以通过在字符集开头使用^(取反)来实现。例如,保留所有数字:re.sub(r'[^\d]', '', text)。意思是“匹配任何不是数字的字符,并删除它”。

这个“取反”逻辑是实现“保留”功能的关键,也是新手最容易混淆的地方。在接下来的具体实现中,我们会反复运用这个模式。

3. 函数库实现与细节解析

我们将按照“去除”和“保留”两大类,分别实现针对数字、英文、中文、标点、空格的函数。每个函数我都会给出代码,并解释其中的细节和注意事项。

首先,确保你已经导入了必要的库:

import re

3.1 去除特定字符类型

这类函数的目标是:从字符串中删除指定的某一类字符。

def remove_digits(text): """去除字符串中的所有数字""" return re.sub(r'\d', '', text) def remove_letters(text): """去除字符串中的所有英文字母(大小写)""" return re.sub(r'[a-zA-Z]', '', text) def remove_chinese(text): """去除字符串中的所有中文字符""" # 使用Unicode范围匹配基本汉字 return re.sub(r'[\u4e00-\u9fff]', '', text) def remove_punctuation(text, custom_pattern=None): """ 去除字符串中的标点符号。 参数: text: 原始字符串 custom_pattern: 自定义的正则表达式模式,用于匹配你想去除的标点。 默认为None,使用通用模式 r'[^\w\s]' (去除非单词、非空白字符)。 """ if custom_pattern is None: pattern = r'[^\w\s]' # 通用标点匹配 else: pattern = custom_pattern return re.sub(pattern, '', text) def remove_spaces(text): """去除字符串中的所有空白字符(包括空格、换行、制表符等)""" return re.sub(r'\s', '', text)

实操要点与心得:

  • remove_punctuation的灵活性:我特意将remove_punctuation设计为可接收自定义模式。因为“标点”的定义因场景而异。[^\w\s]虽然通用,但它也会去掉@$等符号,这些在某些场景(如邮箱、货币)可能是需要保留的。如果你只想去除中文句号、逗号,可以传入custom_pattern=r'[,。!?;:“”‘’]'
  • 关于中文匹配的完整性[\u4e00-\u9fff]涵盖了绝大多数常用汉字。如果你处理的文本包含生僻字或繁体字(部分),可能需要扩展范围。一个更保守但更全的做法是使用Python的Unicode属性匹配:re.sub(r'\p{Han}', '', text),但请注意,这需要正则表达式引擎支持(Python的re默认不支持\p{}语法,但第三方regex库支持)。对于99%的场景,基本范围足够了。
  • 性能考量:对于超长字符串(例如百万字级别)的批量处理,re.sub每次编译正则表达式会有微小开销。如果在一个循环中反复调用同一个函数,可以考虑使用re.compile预编译正则对象,能带来一定的性能提升。

3.2 保留特定字符类型

这类函数的目标是:只留下字符串中指定的某一类字符,删除其他所有字符。实现的关键就是使用“取反”字符集[^...]

def keep_digits(text): """仅保留字符串中的数字""" return re.sub(r'[^\d]', '', text) def keep_letters(text): """仅保留字符串中的英文字母(大小写)""" return re.sub(r'[^a-zA-Z]', '', text) def keep_chinese(text): """仅保留字符串中的中文字符""" # 匹配任何非中文字符,并删除 return re.sub(r'[^\u4e00-\u9fff]', '', text) def keep_punctuation(text, custom_keep_pattern=None): """ 仅保留字符串中的标点符号。 参数: text: 原始字符串 custom_keep_pattern: 自定义的正则表达式模式,用于定义你想保留的标点集合。 默认为None,使用通用取反模式 r'[^\w\s]'。 注意:如果提供此参数,函数逻辑将直接匹配并保留该模式定义的字符。 """ if custom_keep_pattern is None: # 通用逻辑:去除非标点字符(即保留标点) return re.sub(r'[^\w\s]', '', text) # 注意:这个实现和remove_punctuation默认情况一样! # 等等,这里有问题!`re.sub(r'[^\w\s]', '', text)` 是删除非单词非空白的字符,结果是只剩下标点吗? # 不对,`[^\w\s]` 匹配的就是标点本身。所以 `re.sub(r'[^\w\s]', '', text)` 是删除标点,而不是保留标点。 # 正确的“保留标点”逻辑应该是:删除所有非标点字符。但“非标点”很难用一个简单的取反集定义。 # 因此,更合理的做法是:如果提供了 custom_keep_pattern,就保留它匹配的;否则,用一个“标点集合”去匹配并保留。 # 修正后的实现: if custom_keep_pattern is not None: # 如果提供了自定义模式,就匹配并连接所有符合该模式的字符 return ''.join(re.findall(custom_keep_pattern, text)) else: # 否则,使用一个常见的标点集合进行匹配保留 # 这是一个常见的中英文标点集合,可根据需要调整 common_punct_pattern = r'[,。!?;:“”‘’、()【】《》…—~!@#$%^&*()_+\-=\[\]{}|;:\'",.<>/?]' return ''.join(re.findall(common_punct_pattern, text)) def keep_spaces(text): """仅保留字符串中的空白字符""" # 注意:这里“仅保留空白字符”通常意义不大,但为了逻辑完整我们实现它。 # 匹配所有非空白字符并删除。 return re.sub(r'[^\s]', '', text)

重要纠偏与深度解析:上面keep_punctuation的注释里暴露了一个关键问题,这也是字符串处理中的一个经典思维陷阱。我们重新梳理一下:

  • “保留”功能的两种实现思路

    1. 思路一(取反删除):匹配“不需要”的字符集,删除它们。例如keep_digits用的是[^\d],匹配所有非数字并删除。
    2. 思路二(正向查找拼接):直接匹配“需要”的字符集,把所有匹配到的结果拼接起来。re.findall(pattern, text)可以返回所有匹配项的列表。
  • 为什么keep_punctuation不能用简单的取反?因为“非标点字符”这个集合太宽泛了,它包含了字母、数字、汉字、空格等等。我们很难用一个简单的、不与其它类别冲突的正则来定义“所有非标点”。相反,“标点字符”这个集合虽然也可能很广,但我们可以用一个相对明确的集合来定义(比如上面列的common_punct_pattern)。 因此,对于“保留标点”这种类别边界相对模糊的操作,使用re.findall进行正向查找和拼接是更可靠、更直观的方法。修正后的函数已经体现了这一点。

  • re.subvsre.findall的选择

    • 当你要“删除”某类明确或易于取反的字符时,用re.sub
    • 当你要“提取”或“保留”某类字符,尤其是这类字符的正向模式比其“补集”模式更容易定义时,用re.findall+''.join()

根据这个原理,我们可以优化一下keep_chinesekeep_letters,虽然用re.sub取反也可以,但用findall在逻辑上同样清晰:

def keep_chinese_v2(text): """仅保留中文字符(使用findall)""" chinese_chars = re.findall(r'[\u4e00-\u9fff]', text) return ''.join(chinese_chars) def keep_letters_v2(text): """仅保留英文字母(使用findall)""" letters = re.findall(r'[a-zA-Z]', text) return ''.join(letters)

4. 组合应用与高级技巧

单一功能往往不能满足复杂需求。实际工作中,我们经常需要组合使用这些函数,或者处理更复杂的规则。

4.1 实现“仅保留数字和字母”

需求很常见,比如清理用户名、生成验证码等。我们可以用两种方法:

方法一:连续使用re.sub取反(不推荐,易错)

def keep_digits_and_letters_bad(text): # 先删除非数字,再在结果上删除非字母?逻辑错误! # 或者:删除既不是数字也不是字母的字符?对,这个思路正确。 return re.sub(r'[^a-zA-Z0-9]', '', text) # 正确

方法二:使用findall和字符集合[...](推荐)

def keep_digits_and_letters(text): """保留数字和英文字母""" # [a-zA-Z0-9] 这个字符集匹配单个数字或字母 matched_chars = re.findall(r'[a-zA-Z0-9]', text) return ''.join(matched_chars)

第二种方法逻辑更直白:找到所有是数字或字母的字符,然后拼回去。

4.2 处理复杂规则:保留中文和中文标点

假设我们需要从一段混合文本中提取纯中文内容,包括中文的标点符号。

def keep_chinese_and_punct(text): """保留中文字符及常见中文标点""" # 定义中文和中文标点的字符集 # 中文汉字范围 + 常见中文标点(这里列举一部分) pattern = r'[\u4e00-\u9fff,。!?;:“”‘’、()【】《》…—]' matched = re.findall(pattern, text) return ''.join(matched) # 测试 sample = “Hello世界!This is a test。123 abc” print(keep_chinese_and_punct(sample)) # 输出:世界!。

4.3 使用flags参数处理多行和大小写不敏感

re函数的flags参数非常有用。例如,re.IGNORECASE(或re.I)可以让我们在匹配英文时忽略大小写。

def remove_letters_case_insensitive(text): """去除所有英文字母,忽略大小写""" # 使用 [a-z] 配合 re.IGNORECASE 标志 return re.sub(r'[a-z]', '', text, flags=re.IGNORECASE) # 等价于 re.sub(r'[a-zA-Z]', '', text)

对于多行文本,re.MULTILINEre.M)会改变^$的行为,使其匹配每一行的开头和结尾,但在我们当前字符匹配的场景下使用不多。

4.4 性能优化:预编译正则表达式

如果你在循环中成千上万次地调用同一个正则处理函数,预编译正则对象可以节省重复编译的开销。

# 预编译常用模式 DIGIT_PATTERN = re.compile(r'\d') CHINESE_PATTERN = re.compile(r'[\u4e00-\u9fff]') LETTER_PATTERN = re.compile(r'[a-zA-Z]') def remove_digits_fast(text): """使用预编译模式去除数字""" return DIGIT_PATTERN.sub('', text) def remove_chinese_fast(text): """使用预编译模式去除中文""" return CHINESE_PATTERN.sub('', text)

5. 实战场景与常见问题排查

理论说再多,不如看实战。下面我结合几个真实场景,展示如何运用上面的函数,并分享一些踩过的坑。

5.1 场景一:清洗用户输入的手机号

用户可能在输入手机号时夹杂空格、横线、括号等。

user_input = “ 我的电话是:138-0013-8000 ,请惠存!” def extract_mobile_number(text): # 第一步:只保留数字 digits_only = keep_digits(text) # 使用前面定义的函数,或 re.sub(r'[^\d]', '', text) # 第二步:检查是否是11位(中国大陆手机号) if len(digits_only) == 11: return digits_only else: # 可能包含国家码或其他数字,这里简单返回数字串或做进一步处理 return digits_only print(extract_mobile_number(user_input)) # 输出:13800138000

避坑提示keep_digits会提取出所有数字。如果文本中有多个数字序列(如“电话138,邮编100000”),它会连在一起变成“138100000”。在这种情况下,你可能需要更智能的模式,比如re.findall(r'\d{11}', text)来直接查找11位连续数字,或者结合上下文判断。

5.2 场景二:从混合文本中提取纯英文单词列表

分析一篇中英混杂的技术文章,想获取所有英文术语。

article = “Python是一种interpreted语言,它强调code readability。列表list和字典dict是它的核心数据结构。” def extract_english_words(text): # 移除所有非英文字母的字符,用空格替代,然后分割 # 先去除数字、中文、标点等,但保留空格(以便分割单词) # 我们可以分步操作,也可以用一个复杂的正则 # 方法:将所有非英文字母和非空格的字符替换为空格 cleaned = re.sub(r'[^a-zA-Z\s]', ' ', text) # 此时字符串里只剩下英文字母和空格,可能有多余空格 words = cleaned.split() return words print(extract_english_words(article)) # 输出:['Python', 'is', 'an', 'interpreted', 'language', 'it', 'emphasizes', 'code', 'readability', 'list', 'and', 'dict', 'are', 'its', 'core', 'data', 'structures'] # 注意:原句中的 'interpreted' 和 'readability' 被正确提取,但 'code' 和 'list', 'dict' 也被提取了。 # 这个结果可能包含很多常见单词,你需要根据停用词表进一步过滤。

心得:这里用[^a-zA-Z\s]匹配非字母且非空格的字符,并将其替换为空格,是一个很实用的技巧。这样能保证单词之间的分隔符被统一成空格,方便后续的split()

5.3 场景三:统计纯中文文本的字符数(去除所有非中文字符后)

def count_pure_chinese_chars(text): """统计文本中中文字符的数量(去除所有非中文后)""" pure_chinese = keep_chinese(text) # 或 keep_chinese_v2(text) return len(pure_chinese) mixed_text = “2024年,《Python编程》销量突破100万册!Amazing!” print(count_pure_chinese_chars(mixed_text)) # 输出:10 (“年”,“《”,“P”,“y”,“t”,“h”,“o”,“n”,“编”,“程”,“》”,“销”,“量”,“突”,“破”,“万”,“册”,“!”) # 注意:这里的中文标点《》和!也被包含在内了,因为我们的 keep_chinese 函数只去除非中文,而中文标点在Unicode中不属于 \u4e00-\u9fff 范围。 # 所以实际上,count_pure_chinese_chars 只统计了汉字。如果要包括中文标点,需要使用 keep_chinese_and_punct 函数。 pure_chinese_and_punct = keep_chinese_and_punct(mixed_text) print(len(pure_chinese_and_punct)) # 输出:13 (增加了《、》、!三个标点)

5.4 常见问题排查表

问题现象可能原因解决方案
中文匹配不全,漏掉了一些字。使用的Unicode范围(\u4e00-\u9fff)未覆盖某些扩展汉字或繁体字。1. 使用更宽的范围,如[\u4e00-\u9fff\u3400-\u4dbf]
2. 安装并使用regex库(pip install regex),它支持\p{Han}属性,能匹配所有汉字。
keep_punctuation函数把字母也保留下来了。自定义的模式custom_keep_pattern定义有误,或者默认的正则逻辑用错(如前文所述的反向逻辑错误)。检查模式是否正确。对于“保留”操作,优先考虑使用re.findall(你要保留的模式, text)然后拼接。确保模式精确描述了你要保留的字符集合。
处理后的字符串里出现了意想不到的空白或换行。在“去除”操作中,可能没有正确处理各种空白字符(\t,\n,\r,\v等)。\s会匹配所有空白。如果只想去除普通空格,应使用' '明确你的需求。使用re.sub(r'\s', '', text)去除所有空白。使用text.replace(' ', '')只去除普通空格。使用re.sub(r'[ \t\n\r\f\v]', '', text)去除常见空白字符。
性能慢,处理大量文本时卡顿。在循环内部反复使用re.sub,且未预编译正则表达式;或者正则表达式本身过于复杂。1. 将固定的正则模式用re.compile预编译,在循环外定义。
2. 如果可能,将多个操作合并成一个复杂的正则表达式(但会降低可读性)。
3. 对于极其简单的字符替换(如固定字符),考虑使用str.replace()str.translate(),它们通常更快。
正则表达式在包含换行符的文本中工作不正常。默认情况下,.不匹配换行符。如果你的模式涉及.,并且需要跨行匹配,需要加上re.DOTALL标志。re.subre.compile中加入flags=re.DOTALL。例如:re.sub(r'pattern', '', text, flags=re.DOTALL)

5.5 一个综合案例:清洗电商商品标题

假设我们有一堆混乱的商品标题,需要提取出核心产品名(中英文单词和数字),去除品牌、型号代码中的特殊符号和多余空格。

dirty_titles = [ “【官方旗舰店】Apple/苹果 iPhone 15 Pro Max 5G手机 256GB 深空黑色 - 2023新款”, “小米(MI) Xiaomi 13 Ultra 徕卡光学镜头 1英寸大底 12GB+512GB 绿色 *套装版*”, “HUAWEI Mate 60 Pro+ 卫星通话 智能手机 (麒麟9000s芯片) 【限时优惠】” ] def clean_product_title(title): # 1. 去除常见干扰符号: 【】、()、-、*、/等 # 定义一个要去除的符号集合 symbols_to_remove = r'[【】()\-*/\·、]' step1 = re.sub(symbols_to_remove, ' ', title) # 替换为空格,避免单词粘连 # 2. 保留中文、英文、数字、空格 # 匹配所有非中文字符、非英文字母、非数字、非空格的字符,并删除 # 正则解释:[^\u4e00-\u9fffa-zA-Z0-9\s] step2 = re.sub(r'[^\u4e00-\u9fffa-zA-Z0-9\s]', '', step1) # 3. 将多个连续空格合并为一个 step3 = re.sub(r'\s+', ' ', step2).strip() return step3 for title in dirty_titles: print(clean_product_title(title)) # 输出: # 官方旗舰店 Apple 苹果 iPhone 15 Pro Max 5G手机 256GB 深空黑色 2023新款 # 小米 MI Xiaomi 13 Ultra 徕卡光学镜头 1英寸大底 12GB 512GB 绿色 套装版 # HUAWEI Mate 60 Pro 卫星通话 智能手机 麒麟9000s芯片 限时优惠

这个案例展示了如何将多个简单的正则操作串联起来,解决一个实际、复杂的问题。关键在于分解步骤,并注意每一步操作对分隔符(如空格)的影响,避免清洗后单词粘在一起。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/16 7:56:55

Unraid配置静态IP避坑指南:从169.254地址到稳定网络

1. 项目概述&#xff1a;从“自动获取169”的坑说起最近在折腾我的家庭服务器&#xff0c;把系统换成了Unraid。这系统用起来是真不错&#xff0c;可视化、Docker、虚拟机啥都行&#xff0c;但刚上手就踩了个大坑&#xff1a;配置静态IP。按理说&#xff0c;这应该是基础操作&a…

作者头像 李华
网站建设 2026/8/16 7:55:30

Visual Studio属性表实战:告别重复配置,实现C++/C#开发环境一键复用

1. 从重复劳动到一键复用&#xff1a;为什么我们需要属性表如果你和我一样&#xff0c;是个常年泡在Visual Studio里的C或C#开发者&#xff0c;那你一定对下面这个场景深恶痛绝&#xff1a;每次新建一个项目&#xff0c;无论是控制台应用、动态库还是桌面程序&#xff0c;都得像…

作者头像 李华
网站建设 2026/8/16 7:55:17

别再把学术写作当“苦力活”了——aigcbiye正在重新定义这件事

各位正在跟论文死磕的朋友们&#xff0c;大家好。 我是你们的老朋友&#xff0c;那个专门扒论文写作底层逻辑的教育博主。 今天这篇文章&#xff0c;不教技巧&#xff0c;不拆方法&#xff0c;咱们纯聊一个“物种”——aigcbiye。一个最近在学术圈悄悄火起来的名字。很多同学…

作者头像 李华
网站建设 2026/8/16 7:51:55

打造统一IDEA配置模板:基于阿里规范提升团队开发效率

1. 项目缘起&#xff1a;为什么我们需要一套统一的IDEA配置模板&#xff1f;如果你在一个团队里写Java&#xff0c;或者你经常在不同的电脑上切换开发环境&#xff0c;那你一定遇到过这样的场景&#xff1a;你写的代码&#xff0c;在同事的IDEA里打开&#xff0c;格式全乱了&am…

作者头像 李华
网站建设 2026/8/16 7:48:18

补铁剂与肠道舒适度有关吗?AIAF补铁剂的友好度科普

词条定义&#xff1a;补铁产品&#xff0c;指用于补充铁元素、改善铁营养不足状态的营养类制品。按铁的形态划分&#xff0c;常见的有基础铁盐类与血红素铁类两大方向。理解这两类的差异&#xff0c;是判断"补铁是否影响肠道舒适度"的第一步。本文以客观陈述方式&…

作者头像 李华
网站建设 2026/8/16 7:46:16

嵌入式开发平台化设计:模块化车板与驱动抽象层实践

1. 这篇文章真正要解决的问题如果你正在准备电子设计竞赛&#xff0c;或者任何嵌入式相关的项目&#xff0c;是不是也陷入了这样的循环&#xff1a;选型、画板、焊接、调试&#xff0c;最后发现大部分时间都耗在了硬件平台的搭建和底层驱动的调试上&#xff0c;真正用于实现核心…

作者头像 李华