Python-正则表达式

一、正则表达式:制定一个匹配规则,找出符合这个规则的字符串

1、元字符

.    #匹配除换行符以外的任意字符
w   #匹配字母或数字或下划线或汉字
W   #匹配任何非字母数字或下划线或汉字
s   #匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
d   #匹配数字
D   #匹配非数字字符
   #匹配一个开始或结束的位置
^    #匹配字符串的开始,如果放在字符串的开头,则表示取非。
[^x] #匹配除了x之外的任何字符
$    #匹配字符串的结束

2、匹配次数

*      #重复零次或多次
+      #重复一次或更多次
?      #重复零次或一次
{n}    #重复n次
{n,}   #重复不少于n次
{n, m} #重复n到m次

3、懒惰限定符

*?      #重复零次或多次,但尽可能减少重复
+?      #重复一次或更多次,但尽可能减少重复
??      #重复零次或一次,但尽可能减少重复
{n,}?   #重复不少于n次,但尽可能减少重复
{n, m}? #重复n到m次,但尽可能减少重复

4、范围

[ ]         #用来匹配一个指定的字符类别
[0-9]       #匹配0~9的数字,同d
[a-z]       #匹配所有的小写字母
[A-Z]       #匹配所有的大写字母
[a-zA-Z]    #匹配所有的字母
[a-z0-9A-Z] #等同于[a-z|0-9|A-Z]

5、[ ] 和 | 的区别

str1 = 'aaabbb'
obj = re.findall(r'[ab]', str1)   #只匹配一个字符a或者b
obj1 = re.findall(r'a|b', str1)   #只匹配一个字符a或者b
obj2 = re.findall(r'[ab]+', str1) #匹配a或者b,可匹配多次;所以结果可包含a和b
obj3 = re.findall(r'a+|b+', str1) #匹配多个a或者多个b;所以结果只能是多个a或者多个b
print('obj: ', obj)
print('obj1: ', obj1)
print('obj2: ', obj2)
print('obj3: ', obj3)

查看结果:

obj:  ['a', 'a', 'a', 'b', 'b', 'b']
obj1:  ['a', 'a', 'a', 'b', 'b', 'b']
obj2:  ['aaabbb']
obj3:  ['aaa', 'bbb']

二、匹配函数

1、match( ) / search( ) / findall( )

str1 = "Cats are so cute.Dogs are so cute.Cats are so cute."

Obj = re.match(r'(w+) are so (w+)', str1)     #re.match()只从头开始匹配
Obj1 = re.search(r'(w+) are so (w+)', str1)   #re.search()在整个字符串匹配,但只返回第一次匹配到的结果
Obj2 = re.findall(r'(w+) are so (w+).', str1) #re.findall()在整个字符串匹配,返回所有匹配到的结果
if Obj:
    print("Obj.group() : ", Obj.group())        #re.match()和re.search()要用group()获取结果
    print("Obj.group(1) : ", Obj.group(1))      #若存在分组,group()保存匹配的整个字符串;group(i)保存分组内的字符串
    print("Obj.group(2) : ", Obj.group(2))
else:
    print("No match!!")

查看结果:

Obj.group() :  Cats are so cute
Obj.group(1) :  Cats
Obj.group(2) :  cute

2、group( ) 和 groups( )

str1 = "Cats are so cute.Dogs are so cute.Cats are so cute."

Obj = re.match(r'(w+) are so (w+)', str1)     #re.match()只从头开始匹配
Obj1 = re.search(r'(w+) are so (w+)', str1)   #re.search()在整个字符串匹配,但只返回第一次匹配到的结果
Obj2 = re.findall(r'(w+) are so (w+).', str1) #re.findall()在整个字符串匹配,返回所有匹配到的结果

print("Obj.group() : ", Obj.group())            #group()显示整个匹配的字符串
print("Obj.groups() : ", Obj.groups())          #groups()只显示分组内的字符串
print("Obj1.groups() : ", Obj1.groups())
print("Obj2 : ", Obj2)                          #若存在分组,findall()只显示分组内的字符串

查看结果:

Obj.group() :  Cats are so cute
Obj.groups() :  ('Cats', 'cute')
Obj1.groups() :  ('Cats', 'cute')
Obj2 :  [('Cats', 'cute'), ('Dogs', 'cute'), ('Cats', 'cute')]

3、compile( )

#match()/search()/findall():先自动编译正则表达式,再用编译后的正则表达式去匹配字符串
res = re.compile(r'w+ are so w+') #若一个正则表达式要多次匹配,可先手动编译,提高效率
obj = res.findall(str1))

#等同于:
obj = re.findall(r'w+ are so w+', str1)

4、span( )获取匹配字符串的下标

>>> str2 = 'Cats  are  so,,, cute'
>>> print(re.search('w{4}', str2).span()) #只有match()和search()支持span(),findall()不支持

(0, 4)

三、split( ) 分割字符串:可指定多个字符串进行分割

>>> str2 = 'Cats  are  so,,, cute'
>>> obj4 = re.split(r'W+', str2)
>>> obj5 = re.split(r'[s,]+', str2)
>>> print(obj4)

['Cats', 'are', 'so', 'cute']

>>> print(obj5)

['Cats', 'are', 'so', 'cute']

四、sub( ) 和 subn( ) 替换匹配的字符串

str1 = 'Cats are so cute'
obj = re.sub('s', '-', str1, 0)   #匹配str1中的所有空格替换成-; 最后一个参数默认为0,表示替换所有
obj1 = re.sub('s', '-', str1, 2)  #最后一个参数指定为2,表示只替换2次
obj2 = re.subn('s', '-', str1, 0) #返回一个元组(替换后的字符串, 替换次数)
obj3 = re.subn('s', '-', str1, 2)
print('obj: ', obj)
print('obj1: ', obj1)
print('obj2: ', obj2)
print('obj3: ', obj3)

查看结果:

obj:  Cats-are-so-cute
obj1:  Cats-are-so cute
obj2:  ('Cats-are-so-cute', 3)
obj3:  ('Cats-are-so cute', 2)
原文地址:https://www.cnblogs.com/jessicaxu/p/7766465.html