1. findall
语法
findall("正则表达式","要匹配的字符串")
把匹配的内容返回到列表
匹配数字 \d
import re
list = re.findall("\d","123331231%%%@@@你好")
print(list)
匹配非数字 \D
import re
list = re.findall("\D","123331231%%%@@@你好")
print(list)
匹配字母或数字或下划线 \w
import re
list = re.findall("\w","1bcdsa23__331231%%%@@@你好")
print(list)
匹配非字母或字母或下划线
import re
list = re.findall("\W","1bcdsa23__331231%%%@@@你好")
print(list)
匹配任意的空白符 \s
import re
list = re.findall("\s"," ")
print(list)
匹配任意非空白符 \S
import re
list = re.findall("\S","adfag fagagah")
print(list)
匹配一个换行符 \n
import re
strvar = """
本来无一物,何处惹尘埃
"""
list = re.findall(r"\n",strvar )
print(list)
匹配一个制表符 \t
import re
strvar = """
本来 无一物,何处惹尘\t\t\t\t埃
"""
list = re.findall(r"\t",strvar )
print(list)
字符组匹配
示例1
import re
list1 = re.findall('a[abc]b','aab abb acb adb')
print(list1)
示例2
import re
list1 = re.findall('a[0123456789]b','a1b a2b a3b acb ayb')
print(list1)
示例3:用-来表示范围
import re
list1 = re.findall('a[0-9]b','a1b a2b a3b acb ayb')
print(list1)
示例4:匹配大写字母
import re
list1 = re.findall('a[A-Z]b','a1b a2b a3b aAb aDb aYb')
print(list1)
示例5: 匹配小写字母
import re
list1 = re.findall('a[a-z]b','a1b a2b a3b acb ayb adb')
print(list1)
注意事项
匹配大小写字母的时候,不推荐A-z,因为这样会把一些特殊符号也匹配进去
同样也不推荐写0-z这种写法,原因也是一样的
示例6:[^]除了中括号里面的剩下的都匹配
import re
list1 = re.findall('a[^a-z]b','a1b a2b a3b acb ayb adb')
print(list1)
量词
? 匹配0个或者1个a
import re
list1 = re.findall('a?b','abbzab abb aab')
print(list1)
+ 匹配1个或者多个a
import re
list1 = re.findall('a+b','b ab aaaaaab abb')
print(list1)
* 匹配0个或者多个a
import re
list1 = re.findall('a*b','b ab aaaaaab abbbbbbb')
print(list1)
{m,n} 匹配m个至n个a
import re
list1 = re.findall('a{1,3}b','aaab ab aab abbb aaz aabb')
print(list1)
贪婪匹配 与 非贪婪匹配 [语法:量词的后面加?号]
贪婪匹配(默认向更多次匹配)
. 表示匹配除换行符外任意一个字符
import re
strvar = "刘能和刘老根和刘铁棍子777子"
list1 = re.findall('刘.',strvar)
print(list1)
?
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.?',strvar)
print(list1)
* 表示前面的正则表达式会0次或多次
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.*',strvar)
print(list1)
+
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.+',strvar)
print(list1)
{}
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.{1,20}子',strvar)
print(list1)
非贪婪匹配(在量词的后面加上?)
?
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.??',strvar)
print(list1)
+
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.+?',strvar)
print(list1)
*
import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.*?',strvar)
print(list1)
{}
import re
strvar = "刘能和刘老根和刘铁棍子777子刘子"
list1 = re.findall('刘.{1,20}?子',strvar)
print(list1)
边界符
\b
word
匹配左边界 \bw
匹配右边界 d\b
import re
strvar = "word pwd zef"
list1 = re.findall(r'\bw\S*',strvar)
print(list1)
^ 和 $
2个都是把字符串看成一个整体
^ 必须以...开头
$ 必须以...结尾
示例1
strvar = "大哥大嫂大爷"
print(re.findall('大.',strvar))
示例2
import re
strvar = "大哥大嫂大爷"
print(re.findall('大.$',strvar))
.虽然能匹配任意一个,但是这里有一个结尾的标识,同时要把strvar看成一个整体,所以结果只能是大爷
示例3
import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.$',strvar))
指定了以大开头,但是要把strvar看成一个整体,同时又有一个结尾的标识符,这个字符串是不满足条件的,所以是一个空列表
示例4
import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?$',strvar))
.*在一起,表示所有,后面这个?表示前面这个只能是0个或者多个,但是因为默认是贪婪的匹配,所有是尽可能多的去匹配
示例6
import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?大$',strvar))
示例7
import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?爷$',strvar))
分组
正常分组 ()
- 正常情况下用()圆括号进行分组 可以用\1 反向引用第一个圆括号匹配的内容
- (?:正则表达式) 表示取消优先显示的功能
正常情况
import re
list = re.findall('.*?_good','wusir_good yfc_good secret男_good')
print(list)
加上括号(会优先显示括号里面的内容)
import re
list = re.findall('(.*?)_good','wusir_good yfc_good secret男_good')
print(list)
取消括号的效果
import re
list = re.findall('(?:.*?)_good','wusir_good yfc_good secret男_good')
print(list)
匹配的优先级
abc abcd 有缺陷,优先匹配了abc ,abcd优先级在后面,导致即使有,也匹配不到
import re
print(re.findall("abc|abcd","abc123 abcd456"))
改造: 把字符串长的放到前面,优先匹配,短的放到后面匹配
import re
print(re.findall("abcd|abc","abc123 abcd456"))
取消括号的示例
示例1:匹配手机号
import re
list = re.findall("(135|171)[0-9]{8}","17126854315 135478931225")
print(list)
这是因为findall会优先显示括号里的内容,所以要把这个优先效果取消掉
import re
list = re.findall("(?:135|171)[0-9]{8}","17126854315 135478931225")
print(list)
2. search
通过正则匹配出第一个对象返回,通过group取出对象中的值
import re
strvar = "匹配www.baidu.com 或者 www.yfc.com"
obj = re.search("(www)\.(baidu|yfc)\.(com)",strvar)
print(obj.group())
重点:匹配第一个对象
取group里面的值
import re
strvar = "匹配www.baidu.com 或者 www.yfc.com"
obj = re.search("(www)\.(baidu|yfc)\.(com)",strvar)
print(obj.group(0))
print(obj.group(1))
print(obj.group(2))
print(obj.group(3))
一次性全部取出(结果放在一个元组里面)
import re
strvar = "匹配www.baidu.com 或者 www.yfc.com"
obj = re.search("(www)\.(baidu|yfc)\.(com)",strvar)
print(obj.groups())
3. 命名分组
语法
(?P<组名>正则表达式) 给这个组起一个名字
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置
示例1
import re
s = "<h1>你好,世界</h1> <h2>世界,你好</h2>"
list2 = re.findall(r"<(.*)>(.*)</(\1)>",s)
print(list2)
\1 表示引用第1个括号里面的内容,同理往后推
示例2: 给小组起名字,反向引用的时候,直接用名字
import re
strvar = "d1f2sdfa"
obj = re.search(r"(?P<tag1>.*?)\d(?P<tag2>.*?)\d(?P<tag3>.*?)(?P=tag1)(?P=tag2)",strvar)
res1 = obj.group()
res2 = obj.groups()
print(res1)
print(res2)
4. 正则相关函数
match
如果search在表达式的前头加上^,那么search 和 match 这两个函数没有区别
import re
strvar = "dj23sdfsdfa"
obj1 = re.match(r"\d",strvar) #这里默认就是以...开头
import re
strvar = "2dj23sdfsdfa"
obj1 = re.match(r"\d",strvar)
print(obj1.group())
用search来写加上^会报同样的错误
import re
strvar = "dj23sdfsdfa"
obj1 = re.search(r"^\d",strvar)
print(obj1.group())
split
import re
strvar = "yfc,wusir%xboyww|科比"
res = re.split("[,%|]",strvar)
print(res)
指定分割次数
import re
strvar = "yfc1342342354354wusir909090909090xboyww43534科比"
res = re.split("\d+",strvar,1)
print(res)
sub和subn
strvar = "alex^wusir%xboyww$科比"
res = re.sub("[\^%$]","-",strvar)
print(res)
# 2 代表替换的次数, 是可选项
res = re.sub("[\^%$]","-",strvar,2)
print(res)
# subn 返回的是元组,其他用法一样,这个元组(替换后的字符串,替换的次数)
res = re.subn("[\^%$]","-",strvar,2)
print(res)
# finditer 匹配字符串中相应内容,返回迭代器 [可以节省内存空间]
strvar = "sdf3423sdfsdf43234sdfsdf23423"
res = re.findall("\d+",strvar)
print(res)
"""迭代器里面放的元素是一个个的对象,通过group方法可以获取对象中的值"""
from collections import Iterator
it = re.finditer("\d+",strvar)
print(isinstance(it,Iterator))
obj = next(it)
print(obj.group())
for i in it:
res = i.group()
print(res)
compile 指定一个统一的匹配规则
"""
写一次正则,就需要编译一次,
同一个正则,重复使用,会造成反复编译,浪费时间
使用compile,定义一次,终身受益.不需要在反复编译,节省时间
"""
strvar = "2342342343sdfd234234234"
res = re.findall("\d+(.*?)\d+",strvar)
print(res)
pattern = re.compile("\d+(.*?)\d+")
print(pattern,type(pattern))
res = pattern.findall(strvar)
print(res)
常用修饰符
re.I 使匹配对大小写不敏感
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
# 1.re.I 使匹配对大小写不敏感
strvar = "<h1>sdfsdfsdf</H1>"
pattern = re.compile("<h1>(.*?)</h1>",flags=re.I)
obj = pattern.search(strvar)
print(obj)
# 单纯获取匹配到的字符串
print(obj.group())
# 匹配第一个小括号拿到的内容
print(obj.group(1))
# 2.re.M 多行匹配,影响 ^ 和 $
strvar = """<h1>sdfsd</h1>
<h2>234234</h2>
<h3>#$#$@@#</h3>
"""
pattern = re.compile("^<.*?>(.*?)<.*?>$",flags=re.M)
res = pattern.findall(strvar)
print(res)
print("<=====>")
# 3.re.S 使 . 匹配包括换行在内的所有字符
"""
不加re.S 括号匹配到的123
加了re.S 括号匹配到的give\n123
"""
strvar = """give
123mefive
"""
pattern = re.compile("(.*?)mefive",flags=re.S)
obj = pattern.search(strvar)
print(obj)
print(obj.group())
print("<==========>")
print(obj.group(1))
标签:正则表达式,list1,re,print,import,strvar,findall
From: https://www.cnblogs.com/yufc/p/17385930.html