python 正则表达式(二) 元字符使用规则

1)----------匹配单个字符与数字------

.               -->匹配除换行符以外的任意字符  
[]              -->[]是字符集合,表示匹配[]中所包含的任意一个字符
[a-z]           -->匹配任意小写字母
[A-Z]           -->匹配任意大写字母
[0-9]           -->匹配任意数字,和[0123456789]效果一样
[0-9a-zA-Z]     -->匹配任意的数字和字母
[0-9a-zA-Z_]    -->匹配任意的数字、字母和下划线
[^sun]          -->匹配除了sun这三个字符之外的所有字符
^称为脱字符,表示不匹配集合中的字符  -->英文输入模式下,按Shite + 6
\d              -->匹配数字,和[0123456789]、[0-9]效果一样
\D              -->匹配非数字字符,和[^0-9]效果一样
\w              -->匹配任意的数字、字母和下划线,效果同[0-9a-zA-Z_]
\W              -->匹配非数字、字母和下划线,效果同[^0-9a-zA-Z_]
\s              -->匹配任意的空白符(空格,换行,回车,换页,指标),效果同[ \f\n\r\t]
\S              -->匹配任意的非空白符(空格,换行,回车,换页,指标),效果同[^ \f\n\r\t]


2)----------锚字符(边界字符)------
^               -->行首匹配,和在[]中使用^时效果不同
$               -->行尾匹配
\A              -->只匹配字符串开始,它和^的区别时:\A只匹配整个字符串的开头,
                   即便在re.M模式下,也不会匹配其它行的行首
\Z              -->只匹配字符串结尾,它和$的区别时:\Z只匹配整个字符串的结尾,
                   即便在re.M模式下,也不会匹配其它行的行尾
\b              -->匹配一个单词(\b的位置就是单词结束的位置)
\B              -->匹配非单词边界

3)----------匹配多个字符------
说明:下方的x,y,z均为假设的普通字符,不具有特殊一样
(xyz)           -->匹配小括号内的xyz(作为一个整体)
x?              -->匹配0个或者一个x        非贪婪匹配(尽可能少的匹配)
x*              -->匹配0个或者任意多个x    贪婪匹配(尽可能多的匹配)
x+              -->匹配至少一个x
x{n}            -->匹配确定的n个x(n事一个非负整数) 
x{n,}           -->匹配至少n个x(n事一个非负整数) 
x{n,m}          n <= 匹配个数 <=m (匹配n个到m个x)
x|y             -->表示或,匹配的是x或y

4)----------特殊------
*? +? x?  最小匹配  通常都是尽可能多的匹配,可以使用这种解决贪婪匹配
对于str = "start part1 stop start part2 stop start part3 stop"
如果用r"start.*stop",则是贪婪匹配  .*尽可能匹配的长一些,匹配结果就是最长的一串
['start part1 stop start part2 stop start part3 stop']

而如果用r"start.*?stop",则是贪婪匹配  .*?尽可能匹配的短一些,匹配结果就是所有的短串
['start part1 stop', 'start part2 stop', 'start part3 stop']

5)匹配的内容中包含有正则表达式的元字符怎么办?
如 str = "2*3=6",想要匹配2*,以及其位置spen,使用r"2*"是不行的
使用\*将*作为普通字符,不作为正则表达式的元字符,r"2\*"
#手机号码匹配:r"^1(([3578]\d)|(47))\d{8}$"
#如果是在字符串中查询,则r"1(([3578]\d)|(47))\d{8}",去掉首尾限制
lstr = ["1321234567","13212345678","132123456780","1321234567a",
        "23212345678","14712345678"]
for ss in lstr:
    print(re.search(r"^1(([3578]\d)|(47))\d{8}$",ss))

#demo1 练习使用.
# 匹配.n
print(re.search(".n","the sun is shine")) #匹配到第一个符合的字符串"un"

#demo2 练习使用[]
#找到一个字符串中的所有数字
listNum = re.findall("[1234567890]","t1od3ay is goo4d t1y5i2")
print(listNum)

#demo 练习使用行首匹配^
print(re.search("^sun","the sun is shine"))#不能匹配到,因为sun不在行首
print(re.search("^sun","sun,the sun is shine"))#能匹配到,因为sun在行首

#demo 练习使用\A  前面加'r',以防其中包含转义字符
print(re.findall("^the","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M))
print(re.findall(r"\Athe","the sun is shine\nthe sun is shine\nthe sun is shine\n",re.M))

#demo 练习使用\b  前面加'r',以防其中包含转义字符
#能找到前三个sun,他们以' '及','为边界结尾,sune也包含了sun,但不能找到
print(re.findall(r"sun\b","sun the sun is sun,sune"))

#demo 练习使用\B  前面加'r',以防其中包含转义字符
#只找到一个sun
print(re.findall(r"sun\B","sun the sun is sun,sune"))
#改用search函数,发现spen =(19,22),就是sune的位置
print(re.search(r"sun\B","sun the sun is sun,sune"))


#demo
print(re.findall(r"s+","sun the ssn is sss,sune"))

#demo
print(re.findall(r"s{3}","sun the ssn is sss,sune"))

#demo
print(re.findall(r"s{2,}","sun the ssn is sss,sune"))

#demo
print(re.findall(r"s{1,2}","sun the ssn is sss,sune"))

#demo
print(re.findall(r"((s|S)un)","sun the ssn is sss,Sune"))

# 提取 sun...day
str = "sun the ssn is sss,Sune,today"
print(re.findall(r"^sun.*day$",str))

str2 ="start part1 stop start part2 stop start part3 stop"
print(re.findall(r"start.*stop",str2))

str2 ="start part1 stop start part2 stop start part3 stop"
print(re.findall(r"start.*?stop",str2))

str3 = "2*3=6"
print(re.search(r"2*",str3)) #只能找到2,而不能找到2*
print(re.search(r"2\*",str3)) #\*将*作为普通字符,不作为正则表达式的元字符

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值