正则表达式教程零基础:语法详解+实战案例,PythonJS场景适配不再踩坑

admin 综合编程开发技术 3


刚学正则表达式的新手是不是总在这些地方碰壁?看着一堆 “\d”“*”“+” 符号就头大,不知道它们到底啥意思;好不容易搞懂基础语法,在 Python 里写的正则放到 JavaScript 里就报错;想验证个手机号、提取个邮箱,网上抄的代码时灵时不灵,改半天也找不到原因。别着急,兔子哥第一次学正则时就闹过笑话,在 Python 里用 “\d {11}” 匹配手机号,结果返回空列表,后来才发现忘了在字符串前加 “r”;换成 JS 写时,又因为没转义反斜杠,“\d” 写成 “\d”,同样匹配失败。今天就带零基础的朋友把正则语法、实战案例和 Python/JS 场景适配讲透,新手跟着学,正则使用不再踩坑,一起往下看吧!

一、基础问题:正则表达式到底是啥?为啥非学不可?


正则表达式是什么?能解决啥问题?


简单说,正则表达式就是一种 “文本匹配规则”,用特殊符号组合成 “规则代码”,快速从文本里找符合条件的内容。比如你想从一堆文字里挑出所有手机号,或者检查用户输的邮箱格式对不对,用正则表达式几行代码就能搞定,比手动写一堆 if 判断高效多了。
它在工作中特别常用:前端用它做表单验证(比如手机号、密码格式),后端用它提取日志里的关键信息,数据分析时用它清洗杂乱的文本数据。学会正则,能省很多重复劳动,这也是为啥它成了程序员必备技能。

必学核心语法符号,新手先吃透这 5 个


正则的核心是符号,就像数学里的加减乘除,每个符号有固定作用。新手不用记所有符号,先掌握这 5 个,基础匹配就够用了:
  • \d:匹配任意数字(0-9),比如 “\d {2}” 能匹配 “12”“35”,但不能匹配 “ab”。
  • \w:匹配字母、数字或下划线,比如 “\w+” 能匹配 “abc”“123”“a_b”,空格和特殊符号不算哦。
  • .(点):匹配任意一个字符(除了换行),比如 “a.b” 能匹配 “aab”“a1b”“a@b”,只要中间是一个字符就行。
  • (星号):表示前面的字符可以出现 0 次或多次,比如 “abc” 里的 b 可以没有(匹配 “ac”)、有 1 个(匹配 “abc”)、有多个(匹配 “abbc”)。
  • +(加号):和星号类似,但前面的字符至少要出现 1 次,比如 “ab+c” 必须有 b,能匹配 “abc”“abbc”,但不能匹配 “ac”。

符号作用例子匹配结果
\d匹配数字\d{3}123、456
\w匹配字母 / 数字 / 下划线\w{2}ab、12、a_
.匹配任意字符a.ba1b、axb、a@b
*0 次或多次ab*cac、abc、abbc
+至少 1 次ab+cabc、abbc

兔子哥提醒:这些符号看着抽象,结合例子练几遍就熟了。比如记不住 “” 和 “+” 的区别,就想 “” 像星星一样可有可无,“+” 像加号一样必须有一个。

二、场景问题:Python 和 JS 里用正则,用法一样吗?哪里容易错?


基础用法对比:Python 和 JS 的正则创建方式


虽然核心语法一样,但 Python 和 JS 里用正则的 “姿势” 不同,新手不注意很容易踩坑。
场景Python 用法JavaScript 用法关键区别
创建正则用 re 模块,两种方式:
1. 字面量:r'\d {11}'
2. 构造函数:re.compile (r'\d {11}')
两种方式:
1. 字面量:/\d {11}/
2. 构造函数:new RegExp ('\d {11}')
Python 要加 “r” 避免转义;JS 构造函数里反斜杠要写两个 “\”
匹配方法re.findall (reg, str):找所有匹配
re.search (reg, str):找第一个匹配
str.match (reg):返回匹配结果
reg.test (str):返回 true/false(常用)
JS 的 test 方法更适合表单验证

比如匹配手机号,Python 代码是:
python
import retext = "手机号:13812345678"result = re.findall(r'1\d{10}', text)  # 注意加rprint(result)  # 输出:['13812345678']

JS 代码是:
javascript
let text = "手机号:13812345678";let reg = /1\d{10}/;  // 字面量方式// 或构造函数:let reg = new RegExp('1\\d{10}'); 注意两个反斜杠console.log(reg.test(text));  // 输出:true

最容易踩的 3 个跨语言坑,新手提前避


  1. 转义字符处理不同
    Python 里用 “r” 前缀让字符串不转义,所以 “r'\d'” 就是 “\d”;但 JS 里没有 “r” 前缀,字面量方式直接写 “/\d/”,构造函数方式必须用 “\d”(两个反斜杠),不然 “\d” 会被当成普通字符 “d”。
  2. 匹配方法返回值不同
    Python 的 re.findall () 直接返回匹配内容的列表;JS 的 match () 返回包含分组的数组,test () 只返回布尔值,新手容易搞混什么时候用哪个方法。
  3. 修饰符写法不同
    忽略大小写的修饰符,Python 里是在方法里传参数 “re.IGNORECASE”;JS 里是在正则后面加 “i”,比如 “/abc/i”,不用传参数。

网友 “前端小张” 分享:“之前把 Python 的正则直接抄到 JS 里,用构造函数写‘new RegExp ('\d {11}')’,结果一直匹配不到,后来才知道要写成‘new RegExp ('\d {11}')’,多一个反斜杠就好了!”

三、实战案例:Python/JS 各 2 个场景,边练边学


案例 1:验证手机号(国内规则:11 位数字,以 1 开头)


Python 实现
需求:从文本中提取所有符合规则的手机号。
正则:r'^1 [3-9]\d {9}结尾,确保是完整的 11 位数字)
代码:
python
import retext = "用户1:13812345678,用户2:13987654321,无效号:1234567890"# 提取所有有效手机号phones = re.findall(r'1[3-9]\d{9}', text)  # 简单提取用findallprint(phones)  # 输出:['13812345678', '13987654321']

JS 实现
需求:表单输入时验证手机号格式,不合法提示错误。
正则:/^1 [3-9]\d {9}$/
代码:
javascript
let phoneInput = document.getElementById('phone');phoneInput.onblur = function() {let phone = this.value;let reg = /^1[3-9]\d{9}$/;  // 字面量方式if (!reg.test(phone)) {  // 用test方法判断this.nextElementSibling.textContent = '请输入正确的手机号';} else {this.nextElementSibling.textContent = '';}};

案例 2:提取文本中的邮箱地址


Python 实现
需求:从日志文本中提取所有邮箱。
正则:r'\w+@\w+.\w+'(\w + 匹配用户名和域名,. 匹配点)
代码:
python
import relog = "日志:用户abc@qq.com登录,用户x_y@163.com注册"emails = re.findall(r'\w+@\w+\.\w+', log)print(emails)  # 输出:['abc@qq.com', 'x_y@163.com']

JS 实现
需求:实时检测输入的邮箱格式,正确时提示 “格式可用”。
正则:/\w+@\w+.\w+/
代码:
javascript
let emailInput = document.getElementById('email');emailInput.oninput = function() {let email = this.value;let reg = /\w+@\w+\.\w+/;let tip = this.nextElementSibling;if (reg.test(email)) {tip.textContent = '格式可用';} else if (email !== '') {tip.textContent = '邮箱格式错误(例:abc@qq.com)';}};



四、解决方案:这些错误别再犯!不注意会怎样?


错误 1:转义字符漏写,匹配失败


问题:Python 里没加 “r” 前缀,写成 re.findall ('\d {11}', text);JS 构造函数里没写两个反斜杠,写成 new RegExp ('\d {11}')。
后果:正则里的 “\d” 被当成普通字符 “d”,匹配不到任何数字,返回空结果。
解决:Python 加 “r” 前缀;JS 构造函数用 “\d”,字面量用 “/d/”。

错误 2:贪婪模式导致过度匹配


问题:用 “(.<em>)</em>” 提取网页标题,结果匹配了从第一个到最后一个的所有内容。
后果:获取的内容包含大量无关文本,甚至整个网页源码。
解决:加 “?” 启用非贪婪模式,写成 “(.?)”,匹配到第一个就停止。Python 和 JS 都适用。

错误 3:边界符号缺失,匹配范围失控


问题:验证手机号用 “1\d {10}” 而不是 “^1\d {10}(结尾),确保整个字符串都符合规则。

五、自问自答:新手常问的问题


“正则表达式太难了,有没有捷径能快速学会?”
捷径就是 “先模仿再修改”!刚开始不用自己写复杂正则,找现成的模板(比如手机号、邮箱的正则),先用起来,再慢慢拆成单个符号理解。多在在线工具里测试,改改符号看结果怎么变,比死记语法快多了。
“Python 和 JS 的正则,我该先学哪个?”
看你的工作场景!做前端开发先学 JS 的正则,重点练表单验证;做后端或数据分析先学 Python 的,重点练文本提取。其实学会一个,另一个很容易上手,核心语法都一样,就差几个用法细节。
“在线工具那么多,哪个最适合新手?”
推荐 “菜鸟教程正则测试工具” 和 “RegExr”!前者干净无广告,能标红匹配位置;后者有语法提示,输入符号时会告诉你含义,新手不容易输错。测试正则时多换几个工具交叉验证,避免工具本身的误差。

结尾心得


正则表达式入门难在开头,但只要搞懂核心符号、分清 Python 和 JS 的用法差异,多练几个案例,很快就能上手。兔子哥的经验是,新手别一开始就追求 “万能正则”,先搞定工作中常用的场景(手机号、邮箱验证,简单文本提取),熟练后再挑战复杂匹配。遇到错误别慌,先检查转义字符、贪婪模式和边界符号,这三个地方最容易出问题。平时多在在线工具里测试,把常用正则模板存在笔记里,下次要用直接改,效率会很高。记住,正则是工具,用得多了自然就熟了,加油,新手也能轻松掌握!

标签: 正则表达式 数据分析

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~