首页 > 其他分享 >8. 正则表达式

8. 正则表达式

时间:2023-05-09 18:33:49浏览次数:47  
标签:正则表达式 list1 re print import strvar findall

1. findall

语法

findall("正则表达式","要匹配的字符串")
把匹配的内容返回到列表

匹配数字 \d

import re
list = re.findall("\d","123331231%%%@@@你好")
print(list)

image.png

匹配非数字 \D

import re
list = re.findall("\D","123331231%%%@@@你好")
print(list)

image.png

匹配字母或数字或下划线 \w

import re
list = re.findall("\w","1bcdsa23__331231%%%@@@你好")
print(list)

image.png

匹配非字母或字母或下划线

import re
list = re.findall("\W","1bcdsa23__331231%%%@@@你好")
print(list)

image.png

匹配任意的空白符 \s

import re
list = re.findall("\s","  ")
print(list)

image.png

匹配任意非空白符 \S

import re
list = re.findall("\S","adfag  fagagah")
print(list)

image.png

匹配一个换行符 \n

import re
strvar = """
本来无一物,何处惹尘埃

"""
list = re.findall(r"\n",strvar )
print(list)

image.png

匹配一个制表符 \t

import re
strvar = """
本来  无一物,何处惹尘\t\t\t\t埃
"""
list = re.findall(r"\t",strvar )
print(list)

image.png

字符组匹配

示例1

import re
list1 = re.findall('a[abc]b','aab abb acb adb')
print(list1)

image.png

示例2

import re
list1 = re.findall('a[0123456789]b','a1b a2b a3b acb ayb')
print(list1)

image.png

示例3:用-来表示范围

import re
list1 = re.findall('a[0-9]b','a1b a2b a3b acb ayb')
print(list1)

image.png

示例4:匹配大写字母

import re
list1 = re.findall('a[A-Z]b','a1b a2b a3b  aAb aDb aYb')
print(list1)

image.png

示例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)

image.png

量词

? 匹配0个或者1个a

import re
list1 = re.findall('a?b','abbzab abb aab')
print(list1)

image.png

+ 匹配1个或者多个a

import re
list1 = re.findall('a+b','b ab aaaaaab abb')
print(list1)

image.png

* 匹配0个或者多个a

import re
list1 = re.findall('a*b','b ab aaaaaab abbbbbbb')
print(list1)

image.png

{m,n} 匹配m个至n个a

import re
list1 = re.findall('a{1,3}b','aaab ab aab abbb aaz aabb')
print(list1)

image.png

贪婪匹配 与 非贪婪匹配 [语法:量词的后面加?号]

贪婪匹配(默认向更多次匹配)

. 表示匹配除换行符外任意一个字符

import re
strvar = "刘能和刘老根和刘铁棍子777子"
list1 = re.findall('刘.',strvar)
print(list1)

image.png

?

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.?',strvar)
print(list1)

image.png

* 表示前面的正则表达式会0次或多次

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.*',strvar)
print(list1)

image.png

+

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.+',strvar)
print(list1)

image.png

{}

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.{1,20}子',strvar)
print(list1)

image.png

非贪婪匹配(在量词的后面加上?)

?

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.??',strvar)
print(list1)

image.png

+

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.+?',strvar)
print(list1)

image.png

*

import re
strvar = "刘能和刘老根和刘铁棍子777子刘"
list1 = re.findall('刘.*?',strvar)
print(list1)

image.png

{}

import re
strvar = "刘能和刘老根和刘铁棍子777子刘子"
list1 = re.findall('刘.{1,20}?子',strvar)
print(list1)

image.png

边界符

\b

word
匹配左边界 \bw
匹配右边界 d\b
import re
strvar = "word pwd zef"
list1 = re.findall(r'\bw\S*',strvar)
print(list1)

image.png

^ 和 $

2个都是把字符串看成一个整体
^ 必须以...开头
$ 必须以...结尾

示例1

strvar = "大哥大嫂大爷"
print(re.findall('大.',strvar))

image.png

示例2

import re
strvar = "大哥大嫂大爷"
print(re.findall('大.$',strvar))

.虽然能匹配任意一个,但是这里有一个结尾的标识,同时要把strvar看成一个整体,所以结果只能是大爷
image.png

示例3

import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.$',strvar))

指定了以大开头,但是要把strvar看成一个整体,同时又有一个结尾的标识符,这个字符串是不满足条件的,所以是一个空列表
image.png

示例4

import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?$',strvar))

.*在一起,表示所有,后面这个?表示前面这个只能是0个或者多个,但是因为默认是贪婪的匹配,所有是尽可能多的去匹配
image.png

示例6

import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?大$',strvar))

image.png

示例7

import re
strvar = "大哥大嫂大爷"
print(re.findall('^大.*?爷$',strvar))

image.png

分组

正常分组 ()

  1. 正常情况下用()圆括号进行分组 可以用\1 反向引用第一个圆括号匹配的内容
  2. (?:正则表达式) 表示取消优先显示的功能

正常情况

import re
list = re.findall('.*?_good','wusir_good yfc_good secret男_good')
print(list)

image.png

加上括号(会优先显示括号里面的内容)

import re
list = re.findall('(.*?)_good','wusir_good yfc_good secret男_good')
print(list)

image.png

取消括号的效果

import re
list = re.findall('(?:.*?)_good','wusir_good yfc_good secret男_good')
print(list)

image.png

匹配的优先级

abc abcd 有缺陷,优先匹配了abc ,abcd优先级在后面,导致即使有,也匹配不到

import re
print(re.findall("abc|abcd","abc123 abcd456"))

image.png
改造: 把字符串长的放到前面,优先匹配,短的放到后面匹配

import re
print(re.findall("abcd|abc","abc123 abcd456"))

image.png

取消括号的示例

示例1:匹配手机号
import re
list = re.findall("(135|171)[0-9]{8}","17126854315 135478931225")
print(list)

image.png
这是因为findall会优先显示括号里的内容,所以要把这个优先效果取消掉

import re
list = re.findall("(?:135|171)[0-9]{8}","17126854315 135478931225")
print(list)

image.png

2. search

通过正则匹配出第一个对象返回,通过group取出对象中的值

import re
strvar = "匹配www.baidu.com 或者 www.yfc.com"
obj = re.search("(www)\.(baidu|yfc)\.(com)",strvar)
print(obj.group())

重点:匹配第一个对象
image.png
取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))

image.png
一次性全部取出(结果放在一个元组里面)

import re
strvar = "匹配www.baidu.com 或者 www.yfc.com"
obj = re.search("(www)\.(baidu|yfc)\.(com)",strvar)
print(obj.groups())

image.png

3. 命名分组

语法

(?P<组名>正则表达式) 给这个组起一个名字
(?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置

示例1

import re
s = "<h1>你好,世界</h1> <h2>世界,你好</h2>"
list2 = re.findall(r"<(.*)>(.*)</(\1)>",s)
print(list2)

\1 表示引用第1个括号里面的内容,同理往后推
image.png

示例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)

image.png

4. 正则相关函数

match

如果search在表达式的前头加上^,那么search 和 match 这两个函数没有区别

import re
strvar = "dj23sdfsdfa"
obj1 = re.match(r"\d",strvar) #这里默认就是以...开头

image.png

import re
strvar = "2dj23sdfsdfa"
obj1 = re.match(r"\d",strvar)
print(obj1.group())

image.png
用search来写加上^会报同样的错误

import re
strvar = "dj23sdfsdfa"
obj1 = re.search(r"^\d",strvar)
print(obj1.group())

image.png

split

import re
strvar = "yfc,wusir%xboyww|科比"
res = re.split("[,%|]",strvar)
print(res)

image.png
指定分割次数

import re
strvar = "yfc1342342354354wusir909090909090xboyww43534科比"
res = re.split("\d+",strvar,1)
print(res)

image.png

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

相关文章

  • JavaScript 正则表达式
    正则表达式RegularExpression在编程语言中,正则表达式用于匹配指定的字符串。如果想要在字符串Thedogchasedthecat中匹配到the这个单词,可以使用如下正则表达式:/the/。注意,正则表达式中不需要引号。使用测试方法TestMethodJavaScript中有多种使用正则表达式的方法......
  • 正则表达式和String类有关方法
    正则表达式介绍正则表达式,又被称为规则表达式(RegularExpression,在代码中常简写为regex、regexp或RE),包括普通字符(例如:a到z之间的字符等)和特殊字符(称为元字符)。正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的字符串,被广泛运用于于Scala、PHP、C#、Java、C+......
  • 正则表达式
    用正则表达式查找文本模式importrephoneNumRegex=re.compile(r'\d\d\d-\d\d\d\-\d\d\d\d')mo=phoneNumRegex.search('Mynumberis415-555-4242.')print(mo.group())用importre导入正则表达式模块;用re.compile()函数创建一个Regex对象;向Regex对象的search()方......
  • 正则表达式?表示匹配前一个字符0次或者1次
     001、[root@PC1test]#lsa.txt[root@PC1test]#cata.txt33ackkddadebckkadabcuyddgg88[root@PC1test]#grep-E"ab?c"a.txt##"ab?c"等价与ac+abc33ackkadabcuy[root@PC1test]#grep"ab?c"a.txt##在g......
  • 正则表达式_常见语法
    1.正则表达时格式一: 2.正则表达式_从长串字符串中找到正则表达式的内容: 3.符号匹配: 4.正则表达式[]匹配: 5.常见语法: 6.预定义的字符集: 7.正则表达式_数量词: 8.总结: ......
  • Mastering Regular Expressions(精通正则表达式) 阅读笔记:第一章,概念
    RealScenario(现实场景)Here'sthescenario:you'regiventhejobofcheckingthepagesonawebserverfordoubledwords(suchas"thisthis"),acommonproblemwithdocumentssubjecttoheavyediting.任务:检查文本中重复的单词(doubledwords),比如&q......
  • 正则表达式
     /*一:基本操作二:匹配:单字符三:匹配:多字符四:开头结尾五:匹配分组*/ 一:基本操作importreif__name__=='__main__':#匹配操作:match()result=re.match(正则表达式,要匹配的字符串)#提取数据:group()result.group()......
  • 常用的正则表达式
    开发过程中中常用正则式身份证弱校验:15位或18位,最后一位为校验位可能为数字或字符X(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)手机号^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$ipv4地址((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.......
  • java-正则表达式判断手机号
    要更加准确的匹配手机号码只匹配11位数字是不够的,比如说就没有以144开始的号码段,故先要整清楚现在已经开放了多少个号码段,国家号码段分配如下:移动:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188联通:130、131、132、152、155、156、185、186......
  • 正则表达式引发的惨痛代价
    关注Java后端技术栈“回复“面试”获取最新资料案例在一次小型项目开发中,我遇到过这样一个问题。为了宣传新品,我们开发了一个小程序,按照之前评估的访问量,这次活动预计参与用户量30W+,TPS(每秒事务处理量)最高3000左右。这个结果来自我对接口做的微基准性能测试。我习惯使用ab工具......