正则模块re,compile,search,findall,finditer,sub,subn,split函数,非贪婪匹配,r的作用

import re
#compile 函数
print("""
compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象。
从compile()函数的定义中,可以看出返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用。
re.compile(pattren[, flag])
pattern为一个字符串形式的正则表达式,flag是可选的,用于设置匹配模式,常见的几种匹配有

re.compile(r'\d+')			// 用于匹配数字
re.compile(r'[a-z]+')		// 用于小写字母
re.compile(r'[A-Z]+')		// 用于大写字母
……
re.compile(r'a.b')			// 符号“.”用来匹配除了换行符以外的任意字符
re.compile(r'a*b')			// 符号“*”前面的字符出现0次或以上(即以后面的字符为准)
re.compile(r'a.*b')			// 符号“.*”贪婪匹配:以a为开始以b为结束的所有内容
re.compile(r'a.*?b')			// 符号“.*?”非贪婪匹配:只要遇到以a为开始以b为结束就匹配
re.compile(r'a.*?(?=b)')		// 与上一条相同,区别在于:匹配结果不包括b


语法
prog = re.compile(pattern)
result = prog.match(string)

等价于
result = re.match(pattern, string)

https://blog.csdn.net/guo_qingxia/article/details/113979135
https://blog.csdn.net/m0_43609475/article/details/119924047
""")

print("""
compile()与match()一起使用,可返回一个class、str、tuple,dict。
""")
pattern = re.compile(r'\d+')
m = pattern.match('one12345678uhhhitwot34four',3,9) # 从下标3即数字1,匹配到下标9即数字7,下标从0开始。留头不留未,即'1'的位置开始匹配,匹配‘7’,最终结果为123456
print(m) #输出一个match对象
print(m.group()) #输出123456


#findall()
print("""
#findall()
compile()与findall()一起使用,返回一个列表。
""")

def main():
    content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
    print("""
    #   \w 匹配数字字母下划线
    #   *   匹配前一个字符出现0次或多次
    #   (数字字母下划线0次或多次)o(数字字母下划线)
    """)
    regex = re.compile('\w*o\w*')
    x = regex.findall(content)
    print(x)
    print("""
    ['Hello', 'from', 'Chongqing', 'montain', 'to', 'you']
    """)
if __name__ == '__main__':
    main()

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
print(ret)
print("""
['9999', '7890', '12345']
""")

#re.search函数
print("""
#re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配,如果没有匹配,就返回一个 None。
compile()与search()搭配使用, 返回的类型与match()差不多, 但是不同的是search(), 可以不从位置0开始匹配。但是匹配一个单词之后,匹配和match()一样,匹配就会结束。
""")

ret = re.search(r"\d+", "阅读次数为9999")
print(ret.group())
print("""
9999
""")

#re.finditer函数
print("""
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
""")

it = re.finditer(r"\d+", "12a32bc43jf3")
for match in it:
    print(match.group())

print("""
12
32
43
3
""")

#re.sub函数
print("""
#re.sub函数
sub是substitute的所写,表示替换,将匹配到的数据进⾏替换。

语法:re.sub(pattern, repl, string, count=0, flags=0)

参数	    描述
pattern	必选,表示正则中的模式字符串
repl	必选,就是replacement,要替换的字符串,也可为一个函数
string	必选,被替换的那个string字符串
count	可选参数,count 是要替换的最大次数,必须是非负整数。如果省略这个参数或设为 0,所有的匹配都会被替换
flag	可选参数,标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。


""")

ret = re.sub(r"\d+", '998', "python = 997")
print(ret)
print("""
\d+ 匹配数字出现一次或多次
匹配字符串中的数字 并替换
把 python = 997  中的998 替换成 997
""")

def add(temp):
    print("""
    此处temp为
    第一个temp = re.search(r"\d+","python = 997")
    第二个temp = re.search(r"\d+","python = 99")
    """)
    #int()参数必须是字符串,类似字节的对象或数字,而不是“re.Match”
    strNum = temp.group()
    num = int(strNum) + 1
    return str(num)
ret = re.sub(r"\d+", add, "python = 997")
print(ret)
ret = re.sub(r"\d+", add, "python = 99")
print(ret)

#re.subn函数
print("""
#re.subn函数
替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受
subn(pattern, repl, string, count=0, flags=0)
# pattern: 正则模型
# repl   : 要替换的字符串
# string : 要匹配的被替换的字符串
# count  : 指定匹配个数 次数
# flags  : 匹配模式
""")


pattern = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
print(re.subn(pattern, r'\2 \1', s))
def func(m):
    return m.group(1).title() + ' ' + m.group(2).title()
print(re.subn(pattern, func, s))
### output ###
# ('say i, world hello!', 2)
# ('I Say, Hello World!', 2)


a,b=re.subn("a\w","替换","sdfadfdfadsfsfafsff") #替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受
print(a) #返回替换后的字符串
print(b) #返回替换次数

print("""
sdf替换fdf替换sfsf替换sff""")
print("""3
""")

#re.split函数
print("""
#re.split函数
根据匹配进⾏切割字符串,并返回⼀个列表。

re.split(pattern, string, maxsplit=0, flags=0)

参数  	    描述
pattern	    匹配的正则表达式
string	    要匹配的字符串
maxsplit	分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数
""")

#匹配冒号或者空格,做切割
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
print("""
['info', 'xiaoZhang', '33', 'shandong']
""")

#python贪婪和⾮贪婪
print("""
#python贪婪和⾮贪婪
Python⾥数量词默认是贪婪的(在少数语⾔⾥也可能是默认⾮贪婪),总是尝试匹配尽可能多的字符;⾮贪婪则相反,总是尝试匹配尽可能少的字符。
例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。
注:我们一般使用非贪婪模式来提取。

在"*","?","+","{m,n}"后⾯加上?,使贪婪变成⾮贪婪。
""")

#第一种
ss = "asdfghjk09089787"
print(re.match("a\w*",ss).group())         #贪婪匹配,匹配尽可能多的字符          #输出   asdfghjk09089787
print(re.match("a\w*?",ss).group(),'\n')   #非贪婪匹配, 匹配尽可能少的字符       #输出   a

print(re.match("a\w?",ss).group())          #贪婪匹配                         #输出    as
print(re.match("a\w??",ss).group(),'\n')    #非贪婪匹配                       #输出    a

print(re.match("a\w+",ss).group())          #贪婪匹配                       #输出   asdfghjk09089787
print(re.match("a\w+?",ss).group(),'\n')    #非贪婪匹配                     #输出   as

print(re.match("a\w{3,9}",ss).group())      #贪婪匹配                       #输出   asdfghjk09
print(re.match("a\w{3,9}?",ss).group(),'\n')#非贪婪匹配                     #输出   asdf

#第二种
print(re.match(r"aa(\d+)","aa2343ddd").group(1))
print(re.match(r"aa(\d+?)","aa2343ddd").group(1))
print(re.match(r"aa(\d+)ddd","aa2343ddd").group(1))
print(re.match(r"aa(\d+?)ddd","aa2343ddd").group(1))

#第三种提取图片地址
# . 匹配任意字符 除\n
test_str="<img data-original=https://www.abccdn.cn/appCovers/2016/11/13/1213973.jpg>"
ret = re.search(r"https://.*?.jpg", test_str)
print(ret.group())
print("""
https://www.abccdn.cn/appCovers/2016/11/13/1213973.jpg
""")

#r的作⽤
print("""
#r的作⽤
与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。
假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\\\”:
前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
Python里的原生字符串很好地解决了这个问题,Python中字符串前⾯加上 r 表示原⽣字符串。
""")
mm = "c:\\a\\b\\c"
print(mm)#c:\a\b\c
ret = re.match("c:\\\\",mm).group()
print(ret)#c:\
ret = re.match("c:\\\\a",mm).group()
print(ret)#c:\a
ret = re.match(r"c:\\a",mm).group()
print(ret)#c:\a
#ret = re.match(r"c:\a",mm).group() #匹配结果c:a,不存在
#print(ret)#AttributeError: 'NoneType' object has no attribute 'group'

参考:
https://blog.csdn.net/guo_qingxia/article/details/113979135
https://blog.csdn.net/m0_43609475/article/details/119924047

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的re模块提供了一种用于处理正则表达式的工具。其中,compile函数可以将正则表达式编译为一个正则对象,从而提高正则表达式的效率。 compile函数的语法如下: re.compile(pattern, flags=0) 其中,参数pattern代表要编译的正则表达式,flags代表可选的标志位,用于控制正则表达式匹配方式。 使用compile函数可以将多次使用的正则表达式进行编译,从而提高程序的效率。在实际开发中,如果需要对一个字符串进行多次匹配操作,建议使用compile函数预编译正则表达式。 例如,假设要匹配所有以字母开头、后跟数字的字符串,可以使用如下代码: ```python import re # 编译正则表达式 pattern = re.compile(r"[a-zA-Z]\d+") # 匹配字符串 result = pattern.findall("A123 B456 C789") print(result) # 输出: ['A123', 'B456', 'C789'] ``` 在上面的代码中,首先使用compile函数编译了正则表达式r"[a-zA-Z]\d+",然后使用findall方法匹配字符串"A123 B456 C789",返回了所有符合条件的子串。 总之,compile函数是一个常有用的正则表达式工具,可以提高正则表达式的效率,减少不必要的匹配操作,从而在实际开发中发挥作用。 ### 回答2: 在Python中,re模块是用于正则表达式操作的标准库。而re中的compile函数是用于将字符串形式的正则表达式编译成一个正则表达式对象,以便在之后的匹配中可以直接使用该对象。 使用compile函数编译正则表达式可以提高匹配效率,特别是在需要重复匹配同一个表达式时。因为每次使用正则表达式匹配都需要重新构建正则表达式的解析树,而使用compile函数编译正则表达式就可以把解析树缓存起来,在需要匹配时可以直接调用缓存的解析树,从而提高了匹配效率。 具体使用方法,可以先使用compile函数正则表达式编译成一个对象,然后使用该对象的match、searchfindall等方法进行匹配操作。例如: import re pattern = re.compile(r'\d+') # 编译正则表达式 result = pattern.findall('hello123world456') # 使用编译后的正则表达式对象进行匹配 print(result) # ['123', '456'] 另外需要注意的是,使用compile函数编译的正则表达式对象是可以重复使用的,因此在需要多次匹配同一个表达式时,可以先编译成对象,然后重复调用该对象的方法进行匹配操作,可以避免重复编译的影响。 ### 回答3: 在Python中,re模块可以用来处理正则表达式compile()函数是re模块的一个方法,它可以将一个正则表达式串编译成一个pattern对象,这个对象可以再次被用来处理字符串。 使用re.compile()函数的一个主要原因是它可以提高代码的执行效率。如果需要多次使用同一正则表达式,如果每次都要编译一遍,就会浪费很多时间。如果编译一次之后,将pattern对象保存在一个变量中,就可以在需要时多次使用,提高了程序的运行速度。 compile()函数有两个参数:pattern和flags。其中,pattern表示要编译的正则表达式字符串,flags是一个可选的参数,用来指定正则表达式匹配模式。flags可以是一组位标志,也可以是具体的某个标志。 注意,使用re.compile()创建的pattern对象只支持基本的正则表达式语法。如果需要使用进阶的语法,比如lookahead或lookbehind,就必须使用re模块中的其他函数。 下面是一个使用compile()函数的简单示例: import re pattern = re.compile(r'\d+') # 匹配所有数字 text = 'there are 123 apples' match = pattern.search(text) if match: print(match.group()) # 输出 123 上面的代码首先用compile()函数创建了一个正则表达式对象,表示匹配所有数字。然后它在文本中搜索这个对象,如果匹配成功,就通过group()方法输出匹配的文本。 总之,compile()函数Python正则表达式的重要组成部分。它可以将需要多次使用的正则表达式对象编译成pattern对象,从而提高程序的效率。使用compile()函数还可以更方便地管理正则表达式,使得代码更加易读易维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值