python常用的正则表达式
0 背景
正则表达式(Regular Expression,简称Regex)是一种用于匹配字符串中字符组合的模式。它们是由一系列字符和特殊符号组成的字符串,这些特殊符号在正则表达式中有着特定的意义。在Python中通过内置的re
模块提供了对正则表达式的支持,允许进行复杂的字符串分析和修改。
正则表达式的应用场景非常广泛,常见的包括:
-
数据验证:检查数据是否符合特定格式,如电子邮件地址、电话号码、网址等。 -
数据提取:从大量文本中提取感兴趣的信息,如从日志文件中提取特定事件的详情。 -
字符串搜索:在文本中查找特定的字符或字符模式。 -
字符串替换:在文本中替换符合特定模式的字符串。 -
文本分析和挖掘:分析文本内容,提取关键信息,进行内容挖掘。
因此, 本文主要描述在python中, 正则表达式的一些常用的应用场景。
1 使用
语法
在进行正式的操作之前, 我们需要了解一些常用的正则表达式的语法, 笔者也根据业务的需要着重描述.
正则表达式的语法包括多种特殊字符和构造,下面是一个简明的表格,列出了一些常用的正则表达式语法及其描述:
符号/构造 | 描述 |
---|---|
. |
匹配除换行符以外的任意单个字符。⭐⭐⭐⭐⭐ |
^ |
匹配输入字符串的开始位置。如果在多行模式中使用,还可以匹配每一行的开始。 |
$ |
匹配输入字符串的结束位置。如果在多行模式中使用,还可以匹配每一行的结束。 |
* |
匹配前面的子表达式零次或多次。⭐⭐⭐⭐⭐ |
+ |
匹配前面的子表达式一次或多次。⭐⭐⭐⭐⭐ |
? |
匹配前面的子表达式零次或一次。也用于表示非贪婪匹配。就是字符有或者没有⭐⭐⭐⭐⭐ |
{n} |
匹配确定的n 次,n 是一个非负整数。 |
{n,} |
至少匹配n 次。⭐⭐⭐⭐⭐ |
{n,m} |
最少匹配n 次且最多匹配m 次,n 和m 是非负整数。⭐⭐⭐⭐⭐ |
[...] |
匹配方括号内的任意一个字符。如果方括号中的第一个字符是^ ,则匹配不在方括号中的任意字符。比如[abc] 表示abc 内的任意一个字符, [a-zA-Z] 表示任一字母, [a-zA-Z0-9] 表示任一字母或数字, [u4e00-u9fff] 表示任一中文字符⭐⭐⭐⭐⭐ |
[^...] |
匹配不在方括号中的任意字符。 |
|
转义特殊字符或表示特殊序列,如n 表示换行,d 表示任意数字。我们有时候需要表达小数点, 但是. 已经表示任意单个字符, 此时我们需要使用. ⭐⭐⭐⭐⭐ |
( ) |
从表达式中捕获内容,被捕获的子表达式可以在表达式或其他工具中使用。⭐⭐⭐⭐⭐ |
d |
匹配任意数字,等价于[0-9] 。⭐⭐⭐⭐⭐ |
D |
匹配任意非数字字符,等价于[^0-9] 。 |
w |
匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_] 。⭐⭐⭐⭐⭐ |
W |
匹配任何非单词字符,等价于[^A-Za-z0-9_] 。 |
s |
匹配任何空白字符,包括空格、制表符、换页符等,等价于[ fnrtv] 。⭐⭐⭐⭐⭐ |
S |
匹配任何非空白字符,等价于[^ fnrtv] 。 |
这份表格涵盖了正则表达式中最常用的语法元素,但正则表达式的功能远不止这些。不同的编程环境可能会在这些基础上有所拓展或变化,因此在具体使用时,还需要参考相应环境或语言的文档。
更多的正则表达式文档可以直接参考以下文档:
https://www.runoob.com/regexp/regexp-syntax.html
https://tool.oschina.net/uploads/apidocs/jquery/regexp.html
示例
准备工作
在python导入正则表达式的包re
import re
提取电话号码
在举的例子中, 以及实际的业务场景中, 可能存在多种正则表达式的写法, 笔者也尽可能提供多种正则表达式的写法, 以下每种正则表达式笔者会写多行, 每行表示一个正则表达式模式, 任选一行即可.
我的电话号码是13812345678,另外一个号码是17798765432。
d{11} # 11个数字就是简单的中国手机号
[0-9]{11}
1[3-9]d{9} # 详细一点的, 有号段区分, 首个数字是1
python实现:
import re
text = "我的电话号码是13812345678,另外一个号码是17798765432。"
# 编译一个正则表达式模式,匹配中国的11位手机号码
pattern = re.compile(r'1[3-9]d{9}')
# 使用findall方法查找所有匹配的手机号码
phone_numbers = pattern.findall(text)
print("找到的电话号码:", phone_numbers)
找到的电话号码: ['13812345678', '17798765432']
提取邮箱
我的电子邮件地址是cxk@orange.com, 另外一个地址是cai_xukun@orange.org。当然, 我还有一些其他的备用电子邮件地址cai.xu.kun@orange.org、cxk666@orange.org。
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,4} # 完全、详细一点的邮箱匹配语法
[w.]+@[w.]+ # 简单一点的
[a-zA-Z0-9_.]+@w+.w+
[w.]+@w+.w+
[w.]+@[w.]+[a-zA-Z]$ # 再加个以字母结尾的
[A-Za-z0-9._]+@[A-Za-z0-9._]+ # w替换掉
[w.]{2,20}@[w.]{2,10} # 限制一下前缀和后缀的长度
[w.]{2,20}@orange.com # 限制一下邮箱的后缀
电子邮件的匹配, 可以根据实际业务进行适当调整, 本文对此不作过多纠结, 仅供语法学习使用.
python实现
text = "我的电子邮件地址是cxk@orange.com, 另外一个地址是cai_xukun@orange.org。当然, 我还有一些其他的备用电子邮件地址cai.xu.kun@orange.org、cxk666@orange.org。"
pattern = re.compile('[a-zA-Z0-9_.]+@w+.w+')
# 使用findall方法查找所有匹配的电子邮件地址
email_addresses = pattern.findall(text)
print("找到的电子邮件地址:", email_addresses)
找到的电子邮件地址: ['cxk@orange.com', 'cai_xukun@orange.org', 'cai.xu.kun@orange.org', 'cxk666@orange.org']
匹配车牌号
text = "我的车牌号是京A12345,朋友的车牌号是津B67890,还有一个新能源车牌号是渝AD12345。"
[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-HJ-NP-Z]{1}[A-HJ-NP-Z0-9]{5}
[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{5,6} # 简单一点的, 包含新能源
python实现
import re
text = "我的车牌号是京A12345,朋友的车牌号是津B67890,还有一个新能源车牌号是渝AD12345。"
pattern = re.compile(r'[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{5,6}')
# 使用findall方法查找所有匹配的车牌号
license_plates = pattern.findall(text)
print("找到的车牌号:", license_plates)
找到的车牌号: ['京A12345', '津B67890', '渝AD12345']
QQ号
我的QQ号是123456789,朋友的QQ号是987654321,还有一个假的QQ号是01234。
d{5,11} # QQ一般5到11位
[1-9]d{4,10} # 首位不能是0
python实现
import re
text = "我的QQ号是123456789,朋友的QQ号是987654321,还有一个假的QQ号是01234。"
# 编译一个正则表达式模式,匹配5到12位的QQ号,首位数字不能为0
pattern = re.compile(r'[1-9][0-9]{4,11}')
# 使用findall方法查找所有匹配的QQ号
qq_numbers = pattern.findall(text)
print("找到的QQ号:", qq_numbers)
找到的QQ号: ['123456789', '987654321']
2 关于
正则表达式主要用于解决与字符串相关的各种问题,尤其是在文本处理方面的问题,包括但不限于:
-
搜索和识别字符串中的特定模式。 -
验证字符串是否符合特定的格式或规则。 -
从字符串中提取所需的信息或数据。 -
对字符串进行复杂的替换和修改操作。
总的来说,正则表达式是处理字符串时一个非常有用的工具,它可以帮助我们以非常灵活和强大的方式解决各种文本处理问题。
如果你觉得这期内容不错的话, 欢迎点赞, 在看, 关注我的微信公众号
原文始发于微信公众号(其之):python常用的正则表达式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/213832.html