当前位置:网站首页>re正则表达式
re正则表达式
2022-08-05 06:41:00 【m0_52339560】
活动地址:CSDN21天学习挑战赛
re正则表达式
正则表达式功能强大,但是还是比较复杂,参考官方文档也不是太好写。这里就是简单记录了一下,要想熟练还是要多使用。写了一部分发现有点写不下去,
概述
正则表达式(称为RE,或正则,或正则表达式模式)本质上是嵌入在Python中的一种微小的、高度专业化的编程语言。
通过正则表达式可以分析和处理字符串。常用的有匹配,替换,分割等操作。
匹配
匹配字符是正则表达式中最重要的部分。
大多数字母和字符只会匹配自己。比如正则表达式test只会完全匹配字符串'test'。注意:在没有设定相关参数的情况下,正则表达式是严格区分大小写的.
除了普通的字符外,正则还有一些特殊的字符,称这些特殊字符为元字符。以下是常用的元字符:
. ^ $ * + ? { } [ ] \ | ( )
下面逐一来介绍这些:
.:该字符可以匹配除去换行符外的任意字符。
^:该字符匹配字符串的开头。
$:匹配字符串的结尾
*:对前面的正则式匹配0到任意次,而且是尽可能多的匹配。
+:对前面的正则式匹配1到任意次,而且是尽可能多的匹配。
?:对前面的正则式匹配0或1此重复。
{m}:对其之前的正则式指定匹配 m 个重复;少于 m 的话就会导致匹配失败。
{m,n}:对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量多。
{m,n}?:对正则式进行 m 到 n 次匹配,在 m 和 n 之间取尽量少。
[...]:匹配出现在...中的字符。如果想匹配一组字符,可以将他们单独列出,也可以使用-来连接这组字符的起始和终止字符,比如匹配所有小写字母[a-z],从ASCII码上看,[a-z]可以匹配a和z之间的所有字符。
[^...]:匹配未出现在...中的字符
|:A|B,A和B可以是任意正则表达式,那么匹配A或者B。
():组合。匹配括号内的任意正则表达式。匹配完成后可以将括号中的匹配结果提取出来。
这里还有一些特殊的序列,如下:
\d \D \s \S \w \W
对它们的功能进行介绍:
\d匹配任何十进制数字;这等价于
[0-9]。
\D匹配任何非数字字符;这等价于
[^0-9]。
\s匹配任何空白字符;这等价于
[ \t\n\r\f\v]。
\S匹配任何非空白字符;这相当于
[^ \t\n\r\f\v]。
\w匹配任何字母与数字字符;这相当于
[a-zA-Z0-9_]。
\W匹配任何非字母与数字字符;这相当于
[^a-zA-Z0-9_]。
反斜杠灾难
在Python的字符串中,字符\需要使用\\来标识。
假设编写一个正则来匹配字符串'\section'。那么需要使用正则\\\\section来表示。
在反复使用反斜杠的正则中,这会导致大量重复的反斜杠,并使得生成的字符串难以理解。
使用正则表达式
编译正则表达式
将一段正则表达式编译成模式对象,进而通过模式对象进行各种操作。
import re p = re.complie('ab*') #将正则表达式编译成模式对象 print(type(p)) #<class 're.Pattern'> res = p.match('abc') print(type(res)) #<class 're.Match'>
应用匹配
一旦你有一个表示编译正则表达式的对象,你用它做什么? 模式对象有几种方法和属性。 这里只介绍最重要的内容。
| 方法 / 属性 | 目的 |
|---|---|
match() | 确定正则是否从字符串的开头匹配。其实就是将整个字符串与正则表达式匹配。 |
search() | 扫描字符串,查找此正则匹配的任何位置。 |
findall() | 找到正则匹配的所有子字符串,并将它们作为列表返回。 |
finditer() | 找到正则匹配的所有子字符串,并将它们返回为一个 iterator。 |
- match():匹配整个字符串,返回Match
import re p = re.compile('[a-z]+') p.match(" ") #None m = p.match("tempo") print(m) #<re.Match object; span=(0, 5), match='tempo'>
- search():匹配整个字符串及其子串,返回Match
p = re.compile('[a-z]+') m = p.search("::: message");print(m) # <re.Match object;span=(4,11), match='message'>
- findall():返回匹配字符串的列表
p = re.compile(r'\d+') m = p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping') print(m) # ['12', '11', '10']
- finditer():将匹配对象的序列返回为一个iterator
iterator = p.finditer('12 drummers drumming, 11 ... 10 ...') print(type(iterator)) # <class 'callable_iterator'>
上面部分代码返回的re.Match有一些常用的方法。
| 方法/属性 | 目的 |
|---|---|
| group() | 返回正则匹配的字符串 |
| start() | 返回匹配的开始位置 |
| end() | 返回匹配的结束位置 |
| span() | 返回包含匹配 (start, end) 位置的元组 |
示例:
import re p = re.compile('[a-z]+') p.match(" ") #None m = p.match("tempo") print(m) #<re.Match object; span=(0, 5), match='tempo'> m.group() # 'tempo' print(m.start(), m.end()) #0 5 print(m.span()) #(0, 5)
分组
如果需要从匹配到的字符串中抽取一部分,那么就需要使用分组。
p = re.compile('(\w*)\s(\w*).*')
res = p.match('abc word hello')
print(res.group(0)) #abc word hello
print(res.group(1)) #abc
print(res.group(2)) #word
贪婪与非贪婪
这要介绍.*和.*?。
.*:尽可能多地匹配。.*?:尽可能少地匹配。
s = '<html><head><title>Title</title>'
print(re.match('<.*>', s).group())
# <html><head><title>Title</title>
print(re.match('<.*?>', s).group())
# <html>
参考资料
- https://docs.python.org/zh-cn/3.8/howto/regex.html#match-versus-search
- https://docs.python.org/zh-cn/3.8/library/re.html#re-syntax
- https://blog.csdn.net/yuan2019035055/article/details/124217883
边栏推荐
猜你喜欢
随机推荐
UDP组(多)播
The NDK compiler so libraries
七夕!专属于程序员的浪漫表白
h5页面回退到微信小程序并携带参数
性能提升400倍丨外汇掉期估值计算优化案例
RNote108---Display the running progress of the R program
RNote108---显示R程序的运行进度
2022起重机司机(限桥式起重机)考试题库及模拟考试
document.querySelector() method
技术分析模式(十一)如何交易头肩形态
工作3年,回想刚入门和现在的今昔对比,笑谈一下自己的测试生涯
字节面试流程及面试题无私奉献,吐血整理
【网友真实投稿】为女友放弃国企舒适圈,转行软件测试12k*13薪
八大排序之快速排序
AI+视频技术助力保障校园安全,校园智能安防平台该如何建设?
typescript67-索引查询类型
Japan Sanitary Equipment Industry Association: Japan's warm water shower toilet seat shipments reached 100 million sets
LaTeX Notes
Flink学习12:DataStreaming API
2022最强版应届生软件测试面试攻略









