【前沿技术Trip Three】正则表达式
正则表达式。
一句话概括
正则表达式(Regular Expression,常简写为 regex 或 regexp)是一种用特定模式字符串来匹配、查找、替换文本的强大工具。
你可以把它想象成一种超级增强版的“Ctrl+F”查找功能。它不仅能够查找一个固定的词(比如“hello”),还能定义一个文本模式,用来匹配所有符合这个模式的字符串。
一个生动的比喻
把它比作一个 “通配符”或者“模板”:
• 当你在电脑里搜索文件时,你可能会用 *.jpg 来查找所有的图片文件。这里的 * 就是一个简单的通配符,代表任意字符。
• 正则表达式就是这种思想的超级加强版,它提供了一整套强大而精确的语法,让你能描述极其复杂的文本规则。
它能做什么?
主要有三大功能:
-
匹配(Match):判断一个字符串是否符合某个模式。
◦ 例如:判断用户输入的邮箱地址格式是否正确。 -
查找(Search):在一个长文本中找出所有符合某个模式的片段。
◦ 例如:在一篇文章中找出所有的电话号码或日期。 -
替换(Replace):将文本中所有符合某个模式的部分替换成其他内容。
◦ 例如:将一段文本中所有“TODO”开头的行批量删除,或者将日期格式从 “YYYY-MM-DD” 改为 “MM/DD/YYYY”。
一个简单的例子
假设我们要从一段文本中找出所有手机号码。
中国的手机号码通常是 11 位数字,并且以 1 开头。我们可以用这个正则表达式来匹配它:
/1[3-9]\d{9}/
我们来分解一下这个“模式”:
• 1:表示第一个字符必须是数字 1。
• [3-9]:表示第二个字符可以是 3 到 9 之间的任意一个数字。
• \d:这是一个特殊符号,代表任意一个数字(0-9)。
• {9}:表示前面的 \d 必须连续出现 9 次。
所以,这个模式翻译成白话就是:“以1开头,第二位是3-9,后面跟着任意9个数字”。这就能非常精确地匹配到手机号码。
常用的元字符(构建模式的积木)
正则表达式有一套自己的语法,由一些特殊字符(称为元字符)组成。以下是几个最常用的:
元字符 含义 举例 匹配示例
. 匹配任意单个字符(除了换行符) a.c “abc”, “aac”, “a@c”
\d 匹配一个数字 \d\d “42”, “01”
\w 匹配一个字母、数字或下划线 \w\w “Ab”, “a1”, “_2”
\s 匹配一个空白符(空格、制表符等) a\sb “a b”
[abc] 匹配方括号内的任意一个字符 [aeiou] 匹配任何一个元音字母
[^abc] 匹配除了方括号内字符的任意字符 [^0-9] 匹配任何一个非数字字符
- 前面的元素出现 0 次或多次 ab*c “ac”, “abc”, “abbc”
- 前面的元素出现 1 次或多次 ab+c “abc”, “abbc” (不能匹配”ac”)
? 前面的元素出现 0 次或 1 次 colou?r “color”, “colour”
{n} 前面的元素出现恰好 n 次 \d{4} 4位数字,如年份“2023”
^ 匹配字符串的开始位置 ^Hello 匹配以“Hello”开头的字符串
$ 匹配字符串的结束位置 end$ 匹配以“end”结尾的字符串
应用场景
正则表达式无处不在,尤其是在编程和数据处理中:
• 表单验证:验证邮箱、电话、密码强度等。
• 数据抓取(爬虫):从网页源码中提取特定信息(如链接、标题)。
• 文本编辑器(VS Code, Sublime等):进行高级的查找替换。
• 日志分析:从大量日志中筛选出错误信息或特定事件。
• 命令行工具(grep, sed, awk):在Linux/Unix系统中处理文本。
不得不指出,正则表达式在LLM上的使用十分广泛
正则表达式(Regular Expressions)在LLM(大语言模型)的开发和应用中确实有重要应用,但它的角色更像是“辅助工具”而不是核心组件。以下是几个关键的应用场景:
- 数据预处理(Data Preprocessing)
LLM训练需要大量高质量的文本数据。正则表达式常用于:
• 清理数据:移除HTML标签、特殊字符、无关的标点等
• 标准化文本:统一日期格式(YYYY-MM-DD)、电话号码、URL等
• 分词(Tokenization)辅助:识别特定模式(如电子邮件、数字等)帮助分词器更好处理
示例:用正则清理文本中的HTML标签
import re
clean_text = re.sub(r’<[^>]+>', ‘’, raw_html_text)
- 后处理(Post-processing)
LLM生成的文本可能需要结构化输出,正则表达式可用于:
• 提取信息:从模型输出中抽取日期、金额、关键词等
• 格式校验:确保模型生成的JSON、代码等符合语法
从LLM输出中提取所有日期
dates = re.findall(r’\d{4}-\d{2}-\d{2}', llm_output)
- 提示工程(Prompt Engineering)
在构建复杂提示时,正则可以帮助:
• 动态生成提示:从用户输入中提取实体并插入到提示模板中
• 约束输出格式:要求模型按特定格式(如JSON、列表)生成内容,然后用正则验证
- 路由和分类(Routing & Classification)
在LLM应用中,正则可以作为轻量级过滤器:
• 意图识别:快速匹配简单用户意图(如"帮我退款"→路由到售后模块)
• 触发特定功能:例如匹配"翻译这句话:"后接文本→调用翻译工具
- 安全与合规(Safety & Compliance)
• 过滤敏感信息:用正则掩码电话号码、身份证号等(配合其他技术)
• 检测有害内容:快速匹配已知的不良词汇模式(作为第一道防线)
- 工具调用(Function Calling)
当LLM需要调用外部工具/API时,正则可用于:
• 解析参数:从自然语言中提取API所需的参数(如城市名、日期)
• 验证输入:确保参数符合要求(如邮箱格式、数字范围)
从用户查询中提取城市名
user_query = “我想知道北京明天的天气”
city_match = re.search(r’(北京|上海|广州|深圳)', user_query)
if city_match:
city = city_match.group(1)
call_weather_api(city)
为什么正则表达式仍然重要?
尽管LLM能理解自然语言,但正则表达式提供了:
• 精确性:100%匹配特定模式(如电话号码)
• 高效率:比调用LLM更快、更便宜
• 确定性:规则明确,不会产生幻觉
典型工作流:正则 + LLM 协同
现代LLM应用常采用混合架构:
- 先用正则处理简单、规则明确的任务
- 再用LLM处理需要语义理解的部分
- 最后用正则对LLM输出进行格式化和验证
例如客服机器人:
• 用户输入:“我要退款订单号202409171001”
• 正则提取订单号:re.findall(r’订单号(\d+)', input_text)
• LLM生成退款理由:refund_reason = llm.generate(“用户退款原因分析: {input}”)
• 正则验证结果:确保返回格式符合API要求
总结
正则表达式在LLM生态中扮演着数据清洗、模式匹配、格式约束等重要角色,与LLM的能力形成互补。虽然LLM能处理复杂语言任务,但正则表达式在规则明确、需要高效精确处理的场景下仍然是不可或缺的工具。
如何学习和使用?
• 学习:建议从简单的模式开始,理解元字符的含义,多练习。网上有很多交互式学习和测试工具。
• 测试工具:在写复杂的正则时,强烈推荐使用在线测试工具,如 https://regex101.com/ 或 https://regexr.com/。它们可以实时高亮匹配结果,并解释你的正则表达式每一部分的含义,对学习和调试非常有帮助。
总结
正则表达式初看可能像是一堆乱码,但它实际上是一套极其强大且高效的文本处理语言。一旦掌握,它能让你在处理字符串时事半功倍,是程序员和IT从业者的必备技能之一。