欢迎光临
我们一直在努力

正则表达式没那么难!Python 字符串处理的“作弊码”

🎯 正则表达式到底是什么?

简单来说,正则表达式就是一种字符串匹配的“规则表达式”。它能让你从一大段文本里快速筛选、替换符合特定模式的内容,比如验证手机号、提取邮箱、清洗数据等等。在 Python 里,我们只需要导入 re 库就能使用它。  

🧩 核心匹配函数:match、search、findall

这三个函数是正则表达式的基础,也是最常用的工具,我们一个一个来看。

1. match():只在字符串开头匹配

• 它会从字符串的起始位置开始检查是否匹配规则

• 如果开头不匹配,直接返回 None

• 成功匹配则返回一个匹配对象,包含匹配的位置和内容

import re
message = '张三、李四、王五、赵六'
result = re.match('张三',message)
print(result)

这个例子里,'张三' 正好在字符串开头,所以匹配成功。如果我们用 match('李四', message),就会返回 None,因为它不在开头。 2. search():扫描整个字符串

• 它会扫描整个字符串,找到第一个符合规则的内容

• 不管位置在哪里,只要找到一个就返回结果

• 同样返回匹配对象或 None

import re
message = '张三、李四、王五、赵六'
result = re.search('王五',message)
print(result)

这里 '王五' 不在开头,但 search() 还是找到了它。这就是和 match() 最大的区别。 3. findall():找出所有匹配内容

• 它会扫描整个字符串,把所有符合规则的内容都找出来

• 返回一个列表,包含所有匹配到的子串

import re
message = '张三、李四、王五、赵六、王五'
result = re.findall('王五',message)
print(result)

 

🎨 正则表达式的语法规则

掌握了基本函数,接下来就是学习如何写“规则”了。正则表达式有一套自己的语法,我们来看几个最常用的。

1. 字符范围

[a-z] 匹配任意小写字母
[A-Z] 匹配任意大写字母
[0-9] 匹配任意数字
[a-zA-Z0-9] 匹配任意字母或数字

import re
message = 'Python93,C87,Java63,C++88'
result_1 = re.search('[cn]',message)
result_2 = re.findall('[0-9]',message)
result_3 = re.findall('[cn][0-9]',message)
print(result_1,result_2,result_3)

2. 匹配次数

* 匹配前面的表达式 0 次或多次
+ 匹配前面的表达式 1 次或多次
? 匹配前面的表达式 0 次或 1 次
^ 匹配输入行首
$ 匹配输入行尾
{n} 匹配前面的表达式正好 n 次
{n,} 匹配前面的表达式至少 n 次
{n,m} 匹配前面的表达式 n 到 m 次

import re
message = 'da2a7ddbre77yifed777t3fefd7777b'
result = re.findall('[a-z]*[0-9][a-z]',message)
print(result)

验证手机号码的正确性:

import re
phone_num = input("请输入您的手机号码:")
result = re.findall('^1[0-9]{10}$',phone_num)
print(result)

验证QQ号码是否合规:

import re
QQ_num = input("请输入您的QQ号: ")
result = re.match('[1-9][0-9]{4,10}$',QQ_num)
print(result)

验证网站用户名:

import re
use_name = input("请输入您的用户名: ")
result = re.findall('^[A-Za-z_]\\w{7,}$',use_name)
print(result)

import re
use_name = input("请输入您的用户名: ")
result = re.findall('^[A-Za-z_]\\w{7,}$',use_name)
print(result)

3. 特殊字符

\\d

匹配一个数字类字符,等价于 [0-9]

\\D 匹配一个非数字类字符,等价于[^0-9]
\\s 匹配任意不可见字符,等价于[\\f\\n\\r\\t\\v]
\\S 匹配任何可见字符,等价于[^\\f\\n\\r\\t\\v]
\\w 匹配包括下划线的任何单词字符,等价于 [a-zA-Z0-9_]
\\W 匹配任何不包括下划线的非单词字符,等价于[^A-Za-z0-9_]
\\b 匹配一个单词的边界,即单词与空格邻接的字符
\\B 匹配非单词边界
\\f 匹配一个分页符
\\n 匹配一个换行符
\\r 匹配一个回车符
\\t 匹配一个制表符
\\v 匹配一个垂直制表符
. 匹配除\\n和\\r之外的任何单个字符

import re
message = 'verb very never every'
result = re.findall(r'\\w+er\\B',message)
print(result)

import re
message = 'verb very never every'
result = re.findall('.e',message)
print(result)

⚙️ 贪婪与非贪婪模式

贪婪模式:正则表达式默认是贪婪模式,匹配形式是尝试匹配尽可能多的字符,只要满足正则表达式要求会匹配最多的字符。

非贪婪模式:匹配形式是尝试匹配尽可能少字符,一旦满足正则表达式要求就不再继续匹配。

import re
message = 'ccc739134792hd'
result = re.findall('ccc\\d+',message)
print(result)

import re
message = 'ccc739134792hd'
result = re.findall('ccc\\d+?',message)
print(result)

🚀或和组 

如果需要筛选出组合条件下的字符数据,可以使用或。如果需要筛选后的某部分内容,可以使用组。

1.或:用 | 表示,表示将两个匹配条件进行逻辑“或”(or)运算。

import re
message = 'verb very never every'
result = re.findall('\\w+evI\\w+ry',message)
print(result)

2.组:用(表达式)表示,表示将()中的表达式定义为组,并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个组)。

import re
message = 'verb very never every'
result = re.findall("e(.+)(.)r",message)
print(result)

🛠️ 进阶功能:sub() 和 compile()

除了匹配,正则表达式还有两个非常实用的功能。

1. sub():替换匹配内容

这个函数可以把字符串中所有匹配到的内容替换成新的字符串。

import re
content = 'dh9322hf9f934hfnf39d'
content = re.sub('\\d','0',content)
print(content)

2. compile():预编译正则表达式

如果你需要多次使用同一个正则表达式,可以先预编译它,这样能提高效率。

import re
contentl = '2020 12 15 12:00'
pattern = re.compile('\\d{2}:\\d{2}')
print(pattern.findall(contentl))

 

💡 学习正则表达式的小建议

1. 从小例子开始:不要一开始就写复杂的正则,先从匹配单个字符、简单数字开始,慢慢增加复杂度。

2. 多用在线工具测试:比如 Regex101,可以实时看到你的正则表达式匹配了什么,非常方便调试。

3. 别怕记不住:正则表达式的语法确实多,但常用的其实就那几个。用得多了自然就记住了,记不住的时候随时查文档就好。

4. 先思考再动手:在写正则之前,先想清楚你要匹配的内容有什么规律,比如手机号的格式、邮箱的结构,然后再把这些规律转化成正则表达式。 正则表达式就像一把瑞士军刀,虽然看起来复杂,但一旦掌握了它,处理字符串的效率会大大提高。希望这篇文章能帮你迈出学习正则表达式的第一步。

赞(0)
未经允许不得转载:171主机测评 » 正则表达式没那么难!Python 字符串处理的“作弊码”
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址