当前位置:网站首页>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
边栏推荐
猜你喜欢
随机推荐
腾讯业务安全岗 IDP 谈话总结
Redis进阶
Kioxia and Aerospike Collaborate to Improve Database Application Performance
2022杭电多校六 1006-Maex (树形DP)
PCI Pharma Services Announces Multi-Million Dollar Expansion of UK Manufacturing Facility to Meet Growing Demand for Global High Potency Drug Manufacturing Services to Support Oncology Treatment
Pytorch distributed parallel processing
UDP组(多)播
技术分析模式(八)双顶和底
MySql面试题总结
字节面试流程及面试题无私奉献,吐血整理
文本样式这一篇文章就够了
开启防火墙iptable规则后,系统网络变慢
Advanced Redis
MySQL:order by排序查询,group by分组查询
After working for 3 years, I recalled the comparison between the past and the present when I first started, and joked about my testing career
(JLK105D)中山爆款LED恒流电源芯片方案
算法拾遗十五补链表相关面试题
字体样式及其分类
UDP broadcast
typescript59-泛型工具类型(partial )









