就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
字符匹配(普通字符,元字符):
1 普通字符:大多数字符和字母都会和自身匹配:
import reprint(re.findall("a","abc")) #[‘a‘]
2 元字符:. ^ $ * + ? { } [ ] | ( ) \
元字符之. ^ $ * + ? { }
import re
# ret = re.findall(‘a..in‘, ‘helloalvin‘)
# print(ret) # [‘alvin‘]
#
# ret = re.findall(‘^a...n‘, ‘alvinhelloawwwn‘)
# print(ret) # [‘alvin‘]
#
# ret = re.findall(‘a...n$‘, ‘alvinhelloawwwn‘)
# print(ret) # [‘awwwn‘]
#
# ret = re.findall(‘a...n$‘, ‘alvinhelloawwwn‘)
# print(ret) # [‘awwwn‘]
#
# ret = re.findall(‘abc*‘, ‘abcccc‘) # 贪婪匹配[0,+oo]
# print(ret) # [‘abcccc‘]
#
# ret = re.findall(‘abc+‘, ‘abccc‘) # [1,+oo]
# print(ret) # [‘abccc‘]
#
# ret = re.findall(‘abc?‘, ‘abccc‘) # [0,1]
# print(ret) # [‘abc‘]
#
# ret = re.findall(‘abc{1,4}‘, ‘abccc‘)
# print(ret) # [‘abccc‘] 贪婪匹配
注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
# ret=re.findall(‘abc*?‘,‘abcccccc‘)# print(ret) #[‘ab‘]
元字符之字符集[]:
ret = re.findall(‘a[bc]d‘, ‘acd‘) print(ret) # [‘acd‘] ret = re.findall(‘[a-z]‘, ‘acd‘) print(ret) # [‘a‘, ‘c‘, ‘d‘] ret = re.findall(‘[.*+]‘, ‘a.c*d+‘) print(ret) # [‘.‘,‘*‘ ,‘+‘] # 在字符集里有功能的符号: - ^ \ ret = re.findall(‘[1-9]‘, ‘45dha3‘) print(ret) # [‘4‘, ‘5‘, ‘3‘] ret = re.findall(‘[^ab]‘, ‘45bdha3‘) print(ret) # [‘4‘, ‘5‘, ‘d‘, ‘h‘, ‘3‘] ret = re.findall(‘[\d]‘, ‘45bdha3‘) print(ret) # [‘4‘, ‘5‘, ‘3‘]
ret = re.findall(‘[.\-*\^+\\\\]‘, r‘a.^c*d+-\\‘) #代表后面是原生字符串,两个\,在显示的时候,解释器会将每个\转为\\显示出来。print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘, ‘\\‘, ‘\\‘]ret = re.findall(‘[.\-*\^+\\\\]‘, ‘a.^c*d+-\\‘) #代表后面是一个\,因为没有加r来代表原生字符串。print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘, ‘\\‘]
ret = re.findall(‘[.\-*\^+\\\\]‘, r‘a.^c*d+-\m‘)print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘, ‘\\‘]ret = re.findall(‘[.\-*\^+\\\\]‘, r‘a.^c*d+-\\‘)print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘, ‘\\‘,‘\\‘]# ret = re.findall(‘[.\-*\^+\\\\]‘, ‘a.^c*d+-\m\‘) #后面不能是\‘因为代表把‘也转义了。# print(ret)# ret = re.findall(‘[.\-*\^+\\\\]‘, r‘a.^c*d+-\m\‘) #无论是否是原生字符串,\都有转义的功能,如上。# print(ret)ret = re.findall(‘[.\-*\^+\\\\]‘, ‘a.^c*d+-\m\\‘) #字符串后面两个\\到解释器里转化为一个。print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘, ‘\\‘, ‘\\‘]ret = re.findall(‘[.\-*\^+\\\\]‘, r‘a.^c*d+-\a‘) #加上r后,表明里面的\a不再有意义。print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘, ‘\\‘]ret = re.findall(‘[.\-*\^+\\\\]‘, ‘a.^c*d+-\a‘) #这个\a代将无意义的a转化为有意义的了,所以判断不出来。print(ret) #[‘.‘, ‘^‘, ‘*‘, ‘+‘, ‘-‘]
因为\\\\可以拆分为\\ \\,前两个\\交给解释器代表就是一个实实在在的\,然后后面两个代表他就是一个实实在在的\,通过两个实实在在的\\,代表就是转义出一个没有任何意义的\。
# ret=re.findall(‘c\l‘,‘abc\le‘) #报错。# print(ret)#[]# ret=re.findall(‘c\\l‘,‘abc\le‘) #报错。# print(ret)#[]ret=re.findall(‘c\\\\l‘,‘abc\le‘) #[‘c\\l‘]print(ret)#[‘c\\l‘]ret=re.findall(r‘c\\l‘,‘abc\le‘) #[‘c\\l‘]print(ret)#[‘c\\l‘]
元字符之转义符\
反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d
\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_]
\b 匹配一个特殊字符边界,比如空格 ,&,#等
ret=re.findall(‘I\b‘,‘I am LIST‘)print(ret)#[]ret=re.findall(r‘I\b‘,‘I am LIST‘)print(ret)#[‘I‘]ret=re.findall(‘I\\b‘,‘I am LIST‘)print(ret)#[‘I‘]
元字符之分组()
m = re.findall(‘(ad)+‘, ‘addad‘) print(m) #[‘ad‘, ‘ad‘] m = re.findall(‘\d+(?P<id>ad)+‘, ‘1234adadad‘) #巨鸡巴蛋疼 print(m) #[‘ad‘]
m = re.findall(r‘\d+(?:ad)+‘, ‘1234adadad‘)print(m) #[‘1234adadad‘]
ret = re.search(‘(?P<id>\d{2})/(?P<name>\w{3})‘, ‘23/com‘)
print(ret.group()) # 23/com
ret
=
re.findall(
‘www.(baidu|oldboy).com‘
,
‘www.oldboy.com‘
)
print
(ret)
#[‘oldboy‘] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret
=
re.findall(
‘www.(?:baidu|oldboy).com‘
,
‘www.oldboy.com‘
)
print
(ret)
#[‘www.oldboy.com‘]
元字符之|
ret=re.search(‘(ab)|\d‘,‘rabhdg8sd‘) print(ret.group())#ab
常用方法
# 1 a=re.findall(‘a‘, ‘alvin yuan‘) # 返回所有满足匹配条件的结果,放在列表里 print(a) #[‘a‘, ‘a‘] # 2 a=re.search(‘a‘, ‘alvin yuana‘).group() # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 print(a) #a a=re.search("a","12345") # print(a.group()) #报错。 # 3 a=re.match(‘a‘, ‘abcava‘).group() # 同search,不过尽在字符串开始处进行匹配 print(a) # 4 ret = re.split(‘[ab]‘, ‘abcd‘) # 先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割 print(ret) # [‘‘, ‘‘, ‘cd‘] # 5 ret = re.sub(‘\d‘, ‘abc‘, ‘alvin5yuan6‘, 1) #只分割一次,并替换。 print(ret) # alvinabcyuan6 ret = re.subn(‘\d‘, ‘abc‘, ‘alvin5yuan6‘) #全部分割,并显示分割次数。 print(ret,type(ret)) #‘alvinabcyuanabc‘, 2) # 6 obj = re.compile(‘\d{3}‘) ret = obj.search(‘abc123eeee‘) print(ret.group()) # 123
得到一个迭代器ret = re.finditer(‘\d‘, ‘ds3sy4784a‘) #得到一个迭代器。 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) print(next(ret).group())
高阶实验
#匹配出所有的整数
ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") ret.remove("") print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘5‘, ‘-4‘, ‘3‘] ret=re.findall(r"-?\d+\.\d*|(?:-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘-40.35‘, ‘5‘, ‘-4‘, ‘3‘] ret=re.findall(‘(ab)|\d‘,‘rabhdg8sd‘) print(ret) #[‘ab‘, ‘‘] ret.remove("")
import re print(re.findall("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")) #引用?P print(re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")) print(re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")) #引用/1
时间: 2024-11-01 00:17:45