正则表达式:元字符(基本可用来匹配的字符)

  1. # 1: 匹配单个字符与数字 . 匹配除换行符以外的任意字符 [0123456789] 是字符集合,表示匹配方括号中所包含的任意一个字符 如[Mia] 匹配'M','i','a'中任意一个字符 [a-z] 匹配任意小写字母 [A-Z] 匹配任意大写字母 [0-9] 匹配任意数字,类似[0123456789] [0-9a-zA-z] 匹配任意的数字和字母,(不分大小写)(不能加空格,否则也匹配空格) [[0-9a-zA-z_] 匹配任意的数字、字母和下划线 [^Mia] 匹配除了'M','i','a'这几个字母(符)以外的所有字符,"^"称为脱字符,表示不匹配集合中的字符,而匹配其它所有的 [^0-9] 匹配所有的非数字字符 [d] 匹配所有的数字,效果同[0-9] [D] 匹配非数字字符,效果同[^0-9] [w] 匹配数字,字母和下划线,效果同[0-9a-zA-z_] [W] 匹配非数字,字母和下划线 [s] 匹配任意的空白符(空格,换行,回车,换页,制表),效果同[ f ] (Windows中回车是 ,换行是 ) Linux中换行是 ,回车是 ,效果一样) [S] 匹配任意的非空白符,效果同[^ f ]

    import re
    print(re.search('.','I love Mia,Mia is my love'))
    out:<re.Match object; span=(0, 1), match='I'>
    
    # [0123456789]是字符集合,表示匹配方括号中所包含的任意一个字符
    print(re.search('[0123456789]','i am a 9'))
    out:<re.Match object; span=(7, 8), match='9'>
    
    print(re.findall('[w]','jdf gh374'))
    out:['j', 'd', 'f', 'g', 'h', '3', '7', '4']
    
    print(re.findall('.','34j
    lf gdj',flags=re.S))
    out:['3', '4', 'j', '
    ', 'l', 'f', ' ', 'g', 'd', 'j']

         2. 

  

#      2:     锚字符(边界字符)

^          行首匹配,和在[]里的^不是一个意思,即和[^]不同
$          行尾匹配
A         匹配字符串开始,它和^的区别是,'A'只匹配整个字符串的开头,即使在re.M模式下也不会其他行的行首
         匹配字符串结束,它和$的区别是,''只匹配整个字符串的结尾,即使在re.M模式下也不会其他行的行尾
         匹配一个单词的边界,也就是单词和空格间的位置(空格),如'er'可以匹配never,不能匹配nerve
B         匹配非单词边界,如'er'可以匹配nerve,不能匹配never


print(re.search('^Mia','Mia is my love'))
print(re.search('Mia$','Mia is my love,Mia'))
print(re.search('^Mia$','Mia is my love,Mia'))
out:
<re.Match object; span=(0, 3), match='Mia'>
<re.Match object; span=(15, 18), match='Mia'>
None


print(re.findall('^Mia','Mia is my love
Mia is my love',re.M))
print(re.findall('AMia','Mia is my love
Mia is my love',re.M))
out:
['Mia', 'Mia']
['Mia']


print(re.findall('Mia$','Mia is my love,Mia
Mia',re.M))
print(re.findall('Mia','Mia is my love,Mia
Mia',re.M))
out:
['Mia', 'Mia']
['Mia']


print(re.search('er','never'))
out:None


print(re.search(r'er','never'))
print(re.search(r'er','nerve'))
print(re.search(r'erB','never'))   
print(re.search(r'erB','nerve'))
# 加“r”是防止转义!
out:
<re.Match object; span=(3, 5), match='er'>
None
None
<re.Match object; span=(1, 3), match='er'>

3.

#     3:    匹配多个字符
说明:下方的x、y、z均为假设的普通字符,m、n是非负整数,不是正则表达式的元字符
(xyz)     匹配小括号内的xyz(作为一个整体去匹配)
x?        匹配0个或者1个x
x*        匹配0个或者任意多个x (.* 表示匹配任意0个或者任意多个字符(换行符除外)
x+        匹配至少一个x
x{n}      匹配确定的n个x(n是一个非负整数)
x{n,}     匹配至少n个x
x{n,m}    匹配至少n个,最多m个x 注意:(n<=m)
x|y       |表示或,匹配的是x或y


print(re.findall(r'(Mia)','Mia is a good girl,Mia loves me'))
out:
['Mia', 'Mia']

print(re.findall(r'o?','Mia is a good girl,Mia loves me')
out:['', '', '', '', '', '', '', '', '', '', 'o', 'o', '', '', '', '', '', '', '', '', '', '', '', '', 'o', '', '', '', '', '', '', '']


print(re.findall(r'o*','oooo'))
print(re.findall(r'o?','oooo'))    #  贪婪匹配,尽可能少的匹配
print(re.findall(r'o*','ooowwoo'))  # 贪婪匹配,尽可能多的匹配
print(re.findall(r'.*','ooowwoo'))
out:
['oooo', '']
['o', 'o', 'o', 'o', '']
['ooo', '', '', 'oo', '']
['ooowwoo', '']


print(re.findall(r'o+','ooowoo'))   # 贪婪匹配,尽可能多的匹配
out:['ooo', 'oo']


print(re.findall(r'o{4}','ooowo'))
print(re.findall(r'o{4}','oooo'))
print(re.findall(r'o{4}','ooooo'))
print(re.findall(r'o{4}','ooo'))
print(re.findall(r'o{4}','oooowooooo'))
out:
[]
['oooo']
['oooo']
[]
['oooo', 'oooo']


print(re.findall(r'o{3,}','ooooo'))
print(re.findall(r'o{3,}','ooo'))
print(re.findall(r'o{3,}','oo'))
print(re.findall(r'o{3,}','oobooo'))
out:
['ooooo']
['ooo']
[]
['ooo']


print(re.findall(r'o{3,6}','oobooo'))
print(re.findall(r'o{3,6}','oooobooo'))
out:
['ooo']
['oooo', 'ooo']


print(re.findall(r'(m|M)ia','mia--Mia'))
print(re.findall(r'((m|M)ia)','mia--mia--Mia'))   # 打印出来是“组”
out:
['m', 'M']
[('mia', 'm'), ('mia', 'm'), ('Mia', 'M')]


# 需求:提取
import re
str = 'Mia is a good girl!Mia is a nice girl!Mia is a beautiful girl'
print(re.findall(r'^Mia.*girl$',str))
out:
['Mia is a good girl!Mia is a nice girl!Mia is a beautiful girl']

4.

#     4:    特殊
*?  +?   x? 最小匹配,通常都是尽可能多的匹配,可以这种加?的方式解决贪婪匹配
光*和+代表贪婪匹配
(?:x)       类似(xyz),但不表示一个组合

print(re.findall(r'a?','aaa'))
out:['a', 'a', 'a', '']


import re
str = 'Mia is a good girl!Mia is a nice girl!Mia is a beautiful girl'
print(re.findall(r'^Mia.*?girl$',str))
print(re.findall(r'Mia.*?girl',str))
print(re.findall(r'Mia.*girl',str))
out:
['Mia is a good girl!Mia is a nice girl!Mia is a beautiful girl']
['Mia is a good girl', 'Mia is a nice girl', 'Mia is a beautiful girl']
['Mia is a good girl!Mia is a nice girl!Mia is a beautiful girl']


标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'	',等价于 \t )匹配相应的特殊字符。


# 注释 : /*  part1  */     /*  part2  */
print(re.findall(r'//*.*/*/',' /*  part1  */  /*  part2  */'))   # 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。如*,需/*,把*转义,才表示单纯的符号*

out:['/*  part1  */  /*  part2  */']

作者:chauncylii

出处:https://www.cnblogs.com/passengerlee/p/11965398.html

版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

觉得文章不错,点个关注呗!

原文地址:https://www.cnblogs.com/passengerlee/p/10961223.html