Python正则表达式再讲

Python正则表达式再讲

编程时对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

正则表达式(Regular Expression ,简写为 Regex、RE),是用于定义某种特定搜索模式(pattern)的字符组合。正则表达式可用于匹配、查找和替换文本中的字符,进行输入数据的验证,查找英文单词的拼写错误等。

本文是对“Python正则表达式”https://blog.csdn.net/cnds123/article/details/118808861 一文的补充。特别说明,正则表达式非常强大,也比较繁杂,或者说它的语法很难让人们阅读和记忆,要讲清正则的所有内容,用一两篇文章是不可能的,要用好正则需要练习与实践。学习正则表达式需要时间和实践,并且切勿试图一次掌握所有的细节。逐渐积累经验,从简单到复杂进行学习,迭代地提高自己的正则表达式技能。

虽然正则表达式的基本概念在不同的语言中是相似的,但具体的语法和用法可能会有细微差异。如果你熟悉其他语言的正则表达式,使用Python时需要注意这些差异——了解并适应Python的特定语法和函数。如:

语法:Python中的正则表达式语法基于Perl风格,而其他语言可能使用不同的语法风格。例如,C#和Java使用的是类似于JavaScript的正则表达式语法。

字符串表示:在Python中,正则表达式模式需要用字符串表示,并且通常会使用原始字符串(以字母'r'开头)来处理转义字符,这意味着反斜杠字符(\)不会被转义。这使得编写正则表达式更加简洁明了。

在Python中,我们需要先导入re模块——内置的正则表达式模块,才能使用正则表达式功能。而在其他语言中,正则表达式可能是内置的或者属于标准库。

匹配函数:Python中,我们使用re模块提供的match()、search()、findall()等函数来执行正则表达式匹配操作。而在其他语言中,可能会使用不同的函数名称或方法。

Python正则表达式中有一些基本概念需要了解,包括:

字面字符(Literal Character):表示普通的字符,按照字面匹配。例如使用正则表达式a可以匹配字符串中的字母"a"。

元字符(Metacharacters):具有特殊功能和含义的字符。常用的元字符包括 . ^ $ * + ? { } [ ] \ | ( ),它们用于实现模式匹配、数量限定等功能。

字符类(Character Class)也称为字符集合:用方括号 [ ] 包围的一组字符,表示在该位置匹配其中的任意一个字符。例如 [aeiou] 表示匹配任意一个元音字母;[abc]可以匹配字符"a"、"b"或"c"。

量词(Quantifiers):用于指定匹配前面元素的数量。常见的量词包括 *(零次或多次匹配)、+(一次或多次匹配)、?(零次或一次匹配)、{n}(恰好匹配n次)等。例如使用正则表达式a*可以匹配零个或多个字符"a"。

边界匹配(Anchors、锚点):用于匹配字符串的边界位置。常用的边界匹配元字符有 ^(匹配字符串开始位置)和 $(匹配字符串结束位置)。

分组(Grouping):使用圆括号 () 将多个元素组合到一个逻辑单元中,同时可以通过分组捕获来提取匹配的内容。

re.compile()函数是Python中用于编译正则表达式模式的。它的语法如下:

re.compile(pattern, flags=0)

参数含义:

pattern: 需要编译的正则表达式模式。

flags(可选): 可以指定一些标志,例如re.IGNORECASE表示忽略大小写。

re.compile()函数将传入的正则表达式模式编译为一个正则对象,可以用于进行匹配操作。

re.findall()函数的语法如下:

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

参数说明:

pattern: 正则表达式模式,用于匹配字符串。

string: 需要进行匹配的字符串。

flags (可选): 用于指定正则表达式的匹配模式。

返回值:一个包含所有匹配的非重叠子字符串的列表。

、查找给定字符串中所有匹配的模式:

import re
pattern = r"apple"
text = "I have an apple, but my friend has two apples."
matches = re.findall(pattern, text)
print(matches)  # 输出:['apple', 'apples']

又如,仅提取给定文本中的英语单词:

import re
text = "Hello, World! How are you?  你好,世界! "
pattern = r"\b[a-zA-Z]+\b"  # 匹配英文单词的正则表达式模式
result = re.findall(pattern, text)
print(result)  # 输出:['Hello', 'World', 'How', 'are', 'you']

re.match()函数用于尝试从字符串的起始位置匹配一个模式。其语法如下:

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

其中,参数说明如下:

pattern:要匹配的正则表达式模式。

string:要进行匹配的字符串。

flags:可选参数,用于控制正则表达式的匹配方式。

re.match()函数会尝试从字符串的起始位置开始匹配,如果成功匹配到了模式,则返回一个匹配对象,否则返回None。

匹配对象具有一些方法可以获取匹配结果:

group(): 返回整个匹配到的内容。

start(): 返回匹配的起始位置。

end(): 返回匹配的结束位置。

span(): 返回匹配的起始和结束位置的元组。

import re
pattern = r'Hello'
string = 'Hello, World!'
result = re.match(pattern, string)
if result:
    print('匹配成功')
    print('匹配到的内容:', result.group())
    print('起始位置:', result.start())
    print('结束位置:', result.end())
    print('起始和结束位置的元组:', result.span())
else:
    print('匹配失败')

输出结果为:

匹配成功
匹配到的内容: Hello
起始位置: 0
结束位置: 5
起始和结束位置的元组: (0, 5)

本文开头提到的判断一个字符串是否是合法的Email地址,源码如下:

import re
def is_valid_email(email):
    pattern = r'\b\w+@\w+\.\w+\b'  # Email地址的正则表达式模式
    if re.match(pattern, email):
        return True
    else:
        return False

# 测试示例
print(is_valid_email('12345678@cqq.com'))  # 输出:True
print(is_valid_email('john@example.com'))  # 输出:True      
print(is_valid_email('example.com'))       # 输出:False

在上面的代码中,我们使用了正则表达式\b\w+@\w+\.\w+\b,其中:

\b 表示单词边界,确保电子邮件地址前面没有其他字符。

\w+ 表示匹配一个或多个字母、数字或下划线字符。

@ 表示匹配一个 @ 符号。

\w+ 表示匹配一个或多个字母、数字或下划线字符。

\. 表示匹配一个点号。

\w+ 表示匹配一个或多个字母、数字或下划线字符。

\b 表示单词边界,确保电子邮件地址后面没有其他字符。

假设我们有一个包含电子邮件地址的字符串列表,我们想要从中提取所有的邮件地址,可以这样:

import re
text = "要联系我,请发送电子邮件 john@example.com or 12345678@cqq.com"
emails = re.findall(r'\b\w+@\w+\.\w+\b', text)
emails2 = re.findall(r'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9_-]+)', text)
print(emails)  #['john@example.com', '12345678@cqq.com']
print(emails2)  #['john@example.com', '12345678@cqq.com']

上述代码中,用的邮箱的正则表达式模式采用了两种方式。顺便提示 \w 匹配任何字母与数字字符,等价于字符类 [a-zA-Z0-9_] 。

Python正则表达式提供了一种强大的工具,可以在文本处理、模式匹配、表单验证和数据清洗【注】等场景中发挥作用,帮助我们快速、灵活地处理和操作字符串数据。

【注:数据清洗是数据分析中非常重要的步骤,数据清洗是指对原始数据进行处理和转换,从原始数据中去除重复值、无效字符或格式,使其符合分析或应用的要求。下面是一些常见的数据清洗任务:

去除无效字符或格式:使用正则表达式可以去除文本中的特殊字符、HTML标签、空白字符等无效内容,保留有效的文本部分。例如,清洗网页文本时,可以使用正则表达式去除其中的HTML标签。

缺失值处理:通过正则表达式,可以查找并处理包含缺失值或占位符的数据。例如,将缺失的数据替换为特定的值,或根据其他数据进行填充。

格式统一和转换:使用正则表达式可以将数据的格式统一,以便进一步处理或比较。例如,将不同日期格式的数据转换为统一的日期格式,或将数字字符串转换为特定的数值类型。

数据筛选和提取:通过正则表达式,可以根据设定的模式,筛选出满足条件的数据子集,并提取其中的特定信息。例如,从文本数据中提取URL、邮箱地址、电话号码等信息。

错误数据修正:通过正则表达式匹配和替换错误的数据,修正或改正数据中的错误。例如,修复日期格式错误、修正拼写错误等。】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值