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

Posted passengerlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式:元字符(基本可用来匹配的字符)相关的知识,希望对你有一定的参考价值。

  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\n\r\t] (Windows中回车是\r\n,换行是\n) Linux中换行是\r,回车是\n,效果一样) [\S] 匹配任意的非空白符,效果同[^ \f\n\r\t]

    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\nlf gdj‘,flags=re.S))
    out:[‘3‘, ‘4‘, ‘j‘, ‘\n‘, ‘l‘, ‘f‘, ‘ ‘, ‘g‘, ‘d‘, ‘j‘]

         2. 

  

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

^          行首匹配,和在[]里的^不是一个意思,即和[^]不同
$          行尾匹配
\A         匹配字符串开始,它和^的区别是,\A只匹配整个字符串的开头,即使在re.M模式下也不会其他行的行首
\Z         匹配字符串结束,它和$的区别是,\Z只匹配整个字符串的结尾,即使在re.M模式下也不会其他行的行尾
\b         匹配一个单词的边界,也就是单词和空格间的位置(空格),如er\b可以匹配never,不能匹配nerve
\B         匹配非单词边界,如er\b可以匹配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\nMia is my love,re.M))
print(re.findall(\AMia,Mia is my love\nMia is my love,re.M))
out:
[Mia, Mia]
[Mia]


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


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


print(re.search(rer\b,never))
print(re.search(rer\b,nerve))
print(re.search(rer\B,never))   
print(re.search(rer\B,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
xn      匹配确定的n个x(n是一个非负整数)
xn,     匹配至少n个x
xn,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(ro?,Mia is a good girl,Mia loves me)
out:[‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, o, o, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, o, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘, ‘‘]


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


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


print(re.findall(ro4,ooowo))
print(re.findall(ro4,oooo))
print(re.findall(ro4,ooooo))
print(re.findall(ro4,ooo))
print(re.findall(ro4,oooowooooo))
out:
[]
[oooo]
[oooo]
[]
[oooo, oooo]


print(re.findall(ro3,,ooooo))
print(re.findall(ro3,,ooo))
print(re.findall(ro3,,oo))
print(re.findall(ro3,,oobooo))
out:
[ooooo]
[ooo]
[]
[ooo]


print(re.findall(ro3,6,oobooo))
print(re.findall(ro3,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(ra?,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(rMia.*?girl,str))
print(re.findall(rMia.*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,等价于 \\t )匹配相应的特殊字符。


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

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

 

以上是关于正则表达式:元字符(基本可用来匹配的字符)的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式完整指南

Hive正则表达式

JAVA正则表达式怎么匹配所有符合要求的子字符串

java中关于正则表达式的基本使用

火星文似的正则表达式

Java 正则表达式匹配基本多语言平面之外的字符