首页 > 代码库 > 爱根,正则表达式re模块。。。

爱根,正则表达式re模块。。。

就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

字符匹配(普通字符,元字符):

1 普通字符:大多数字符和字母都会和自身匹配:

import re
print(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

 

爱根,正则表达式re模块。。。