【10月更文挑战第18天】
|字符
|作用
|
|-|-|
|.|通配符,匹配任意字符(除了\n之外)|
|\d|匹配数字: 0,1,2,3,4,5,6,7,8,9|
|\D|匹配非数字, 即不是数字|
|\s|匹配空白, 即 [\t\n\r\f等]\f换页\r回车|
|\S|匹配非空白,与\s相反|
|\w|匹配单词字符, 即a-z,A-Z,0-9,_,汉字|
|\W |匹配非单词字符,即匹配特殊字符|
\w 匹配单词字符,如字母、数字、下划线、汉字
.的匹配操作
import re
#.匹配任意字符,除了\n
print(re.findall('.','test\tand\n'))
#['t', 'e', 's', 't', '\t', 'a', 'n', 'd']
#可以将整个字符串进行一个拆分,将每个元素进行一个获取放到列表中存放
可以将整个字符串进行一个拆分,将每个元素进行一个获取放到列表中存放
除了\n都能进行匹配的操作
r=re.match('aaa.','aaa1212bbb')
print(r.group())
#aaa1
'''
正则表达式'aaa.'将会匹配字符串'aaa1212bbb'中的'aaa'
后面紧跟着的第一个字符,也就是数字'1'。因此,r.group()将会输出'aaa1'。
'''
\d的匹配操作
将字符串中的数字提取出来
import re
print(re.findall('\d','abd6c123'))
#['6', '1', '2', '3']
\D的匹配操作
将字符串中的非数字匹配提取出来
import re
print(re.findall('\D','abd6c123'))
#['a', 'b', 'd', 'c']
\s的匹配操作
匹配空白字符
import re
print(re.findall('\s','ted \t anfdsa sd '))
#[' ', '\t', ' ', ' ', ' ']
\S的匹配操作
匹配非空白字符
import re
print(re.findall('\S','ted \t anfdsa sd '))
#['t', 'e', 'd', 'a', 'n', 'f', 'd', 's', 'a', 's', 'd']
只要不是空白都能提取出来
\w的匹配操作
标点符号啥的都不进行匹配操作
匹配单词字符,如字母数字下划线等
import re
print(re.findall('\w','hi,小明!'))
#['h', 'i', '小', '明']
\W的匹配操作
作用与\w相反的
import re
print(re.findall('\W','hi,小明!'))
#['h', 'i', '小', '明']
#[',', '!']
[ ] 匹配[ ]列举的任意字符
我们上面的方法里面没有单独将字母进行分离出来的字符
import re
print(re.findall('[a-z]','hi,小明!123'))
#['h', 'i']
括号里面是字母的范围,只要字符串里面有满足这个条件的都会进行剥离出来的
只会匹配括号内列举出来的,一次匹配一个
import re
print(re.findall('[a-z,A-Z]','hi,小明DFS!123'))
#['h', 'i', ',', 'D', 'F', 'S']
在这个例子中,我们在括号内列举了a-z和A-Z,然后中间有个逗号
都算进了寻找的范围
那么如果我们想单单寻找小写和大写的字母的话,这么写
import re
print(re.findall('[a-zA-Z]','hi,小明DFS!123'))
#['h', 'i', 'D', 'F', 'S']
这么写就没有其他多余的元素了
我们想寻找什么东西就把这个写在[ ]内就行了
匹配数字
import re
print(re.findall('[0-9]','hi,小明DFS!123'))
#['1', '2', '3']
在括号内输入寻找数字的范围就行了
匹配数字,但不包含4
import re
print(re.findall('[0-35-9]','hi,小明DFS!124653'))
#['1', '2', '6', '5', '3']
输入范围0-3 5-9
匹配多个字符是基于单个字符的
字符 | 作用 |
---|---|
* | 匹配前一个字符出现0次或者无限次 |
+ | 匹配前一个字符出现1次或者无限次 |
? | 匹配前一个字符出现1次或者0次即要么有1次,要么没有 |
{m} | 匹配前一个字符出现m次, |
{m,} | 匹配前一个字符至少出现m次, |
{m,n} | 匹配前一个字符出现从m到n次 |
*的匹配使用
import re
print(re.findall('\S*','hi,my name is xiaoming'))
#['hi,my', '', 'name', '', 'is', '', 'xiaoming', '']
*允许匹配0次,返回一个空白字符,所以会算上这个空格的
+的匹配使用
import re
print(re.findall('\S+','hi,my name is xiaoming'))
#['hi,my', 'name', 'is', 'xiaoming']
至少匹配1次,所以我们是不会算上空格的
所以说在空格之前都算上匹配中的
*和+的比较
通过比较我们能发现这个用*的话多了很多的空格
因为*允许匹配0次,返回一个空白字符
设置匹配的长度---{m }--匹配长度为m
import re
print(re.findall('\d{3}','1233456'))
#['123', '345']
我们使用{}进行长度的限制,长度至少是3才能进行匹配的操作
至少匹配次数---{m, }
import re
print(re.findall('\S{4,}','hi,my name is xiaoming'))
#['hi,my', 'name', 'xiaoming']
这里我们至少匹配4次才会算数的
这里的is就没有算进去,因为长度是不够的,不满足
匹配{m,n}次
至少匹配m次,最多匹配n次
import re
print(re.findall('\S{2,4}','hi,my name is xiaoming'))
#['hi,m', 'name', 'is', 'xiao', 'ming']
至少两次,最多4次
在这里我们没有进行y的输出,因为不满足条件了,而且后面有个空格,然后就进行下一组的匹配了
贪婪:满足匹配的情况下,尽可能匹配多的数据
非贪婪:满足匹配的情况下,尽可能匹配少的数据
默认是贪婪模式
import re
print(re.findall('\S{2,4}','hi,my name is xiaoming'))
#['hi,m', 'name', 'is', 'xiao', 'ming']
这拿xiaoming 来举例子
我们xiao里面拿两个(xi)也能进行匹配,四个(xiao)也能进行匹配
但是我们这里选择了4个
所以我们这里是贪婪的
贪婪模如何修改为非贪婪模式呢?在匹配多个的后面加上问号?
import re
print(re.findall('\S{2,4}?','hi,my name is xiaoming'))
#['hi', ',m', 'na', 'me', 'is', 'xi', 'ao', 'mi', 'ng']
这种就是非贪婪的,满足条件的情况下尽量匹配少的数据
最上面的那种一次匹配4次,尽可能匹配多的数据,这个就是贪婪的情况
r=re.match('aaa.','aaa1212bbb')
print(r.group())
#aaa1
'''
正则表达式'aaa.'将会匹配字符串'aaa1212bbb'中的'aaa'
后面紧跟着的第一个字符,也就是数字'1'。因此,r.group()将会输出'aaa1'。
'''
#贪婪
r=re.match('aaa.+','aaa1212bbb')
print(r.group())
#aaa1212bbb
#非贪婪
r=re.match('aaa.+?','aaa1212bbb')
print(r.group())
#aaa1
#至少匹配1次并且是非贪婪的,那么尽可能少,
正则表达式'aaa.'将会匹配字符串'aaa1212bbb'中的'aaa'
后面紧跟着的第一个字符,也就是数字'1'。因此,r.group()将会输出'aaa1'。
aaa.+至少匹配一次
但是后面加个?的话那么就只会匹配一次了,
因为是非贪婪了