python正则表达式

print("正则表达式")
import re,string
s = r'abc'     #    r''原样输出,不转义
print(re.findall(s,'aabaab'))  #findall()匹配字符串中所有对应规则的字符
print(re.findall(s,'aabcaabc'))
print('
hi
')
print(r'
hi
')
print("------------------------------------------结束")


#"."表示除换行符以外的任意字符,  S表示不是空白符的任意字符,注意是大写S
s = 'hi,i am a student.my name is Hilton.'
print(re.findall(r'i',s))
print(re.findall(r'.',s))
print(re.findall(r'i.',s))
print(re.findall(r'iS',s))
print("------------------------------------------  ....SSS结束")


#"[]"表示指定字符集,比如:[abc],[a-z],[0-9]
#元字符在方括号中不起作用,例如:[akm$]和[m.]中元字符都不起作用,
#注意用过的数字不会重新用,比如r'x[^3]x'规则,有个字符串x8x4x,这里只算x8x,不会x4x,因为4前面的x被用过了
s = 'map mit mee mwt meqwt'
print(re.findall(r'me',s))
print(re.findall(r'm[iw]t',s)) #[iw]表示里面的任意一个
print(re.findall(r'm[.]',s)) #元字符在方括号无效
s = '0x12x3x567x8xyxyx'
print(re.findall(r'x[0123456789]x',s))
print(re.findall(r'x[0-9]x',s)) #[0-9]表示在0-9的任意数字
print(re.findall(r'x[^3]x',s)) #[^3]表示除了3之外的任意字符
print("------------------------------------------[][][]结束")


#“^":匹配行首(一行的第一个),匹配以^后面的字符开头的字符串,注意和上面的[^]是不同概念
#如果是以什么开头,比如15开头就使用15,表示匹配单词头或单词尾
s = 'hello hello world hello Mary hello John'
print(re.findall(r'hello',s))
print(re.findall(r'^hello',s)) #^hello表示字符中第一个出现的单词
print("------------------------------------------^^^^^^^行首结束")


# "$":匹配行尾,匹配以 $ 之前的字符结束的字符串
# $ 还可以结合{n}限定出现的,比如  .{8}$ 表示除换行符的任意字符只能出现8次,后面的$就是限定只能是8次,如果不加$表示可以出现8次或8次以上
print(re.findall(r'hello$',s))  #这里表示以hello结束的行,但是没有,返回[]
s = 'hello hello world hello Mary hello'
print(re.findall(r'hello$',s))  #这次有了,s重新以hello结尾
s = 'map mit mee mwt meqmtm$'
print(re.findall(r'm[aiw]$',s)) #[aiw]$:表示以方括号里的任意字符结尾
print(re.findall(r'm[aiwt$]',s)) #这里$元字符在[]里面,无效
print(re.findall(r'm[aiwt$]$',s)) #[aiw$]$:表示以方括号里的任意字符结尾,$在[]算普通字符
s = '12345678901'
#这里表示,以12开头,然后第三位数字只能是[1-6]中的数字,后面的{1}表示只能出现1次,
# .{8}$表示除换行符任何字符可出现8次,注意$限定了后面的数字为8个,如果不加$表示出现8次后,还可以出现
print(re.findall(r'12[1-6]{1}.{8}$',s))
print("------------------------------------------$$$结束")



#"":反斜杆后面可以加不同的字符以表示不同的特殊意义
# 匹配单词头或单词尾;
# B和相反,匹配非单词头或单词尾
#  d匹配任何十进制数,相当于[0-9]
#  D于d相反,匹配任何非数字字符,相当于[^0-9]
#  s匹配任何空白字符,相当于[	

fv]
#  S于s相反,匹配任何非空白字符,相当于[^	

fv]
#  w匹配任何字母,数字或下划线字符,相当于[a-zA-Z0-9]
#  W于w相反,匹配任何非字母,数字和下划线字符,相当于[^a-zA-Z0-9]
# 也可以用于取消所有的元字符: \ , [
# 这些特殊字符都可以包含在[]中,如:[s,.]匹配任何空白字符,","或"."

s = '0x12x3x567x8xy'
print(re.findall(r'[0-9]',s))
print(re.findall(r'd',s))
print(re.findall(r'[xd]',s))
print("------------------------------------------反斜杠\\\结束")



#正则表达式除了能匹配不定长的字符集,还能指定正则表达式的一部分的重复次数
#所涉及的元字符有  *   +   ?    {} 四个字符
s = 'a ab abbbbb abbbbbbxa'

# * :匹配位于 * 之前的字符或子模块的0次或多次出现
print(re.findall(r'ab*',s))
print("------------------------------------------****结束")


# + :匹配位于+ 之前的字符或子模块的1次或多次出现
print(re.findall(r'ab+',s))
print("------------------------------------------++++结束")

# ? :匹配位于? 之前的0个或1个字符
#当 ? 紧随其他限定符(* + {n}  {n,}  {n,m})之后时,匹配模式是”非贪心的”。
# "非贪心" 的模式匹配搜索到尽可能短的字符串,而默认的“贪心” 的模式匹配搜索到的,尽可能长的字符串。
print(re.findall(r'ab+',s))  #最大模式,贪心模式
print(re.findall(r'ab+?',s))   #最小模式,非贪心模式
print("------------------------------------------?????结束")

srint = 'hi,i am a student.my name is Hilton.'
#i.*e表示i后面跟0个或多个除换行符以外的任意字符(最大模式匹配,贪心的)再跟字母e
print(re.findall(r'i.*e',s)) 
# i.*?e表示i后面跟0个或多个除换行符之外的任意字符,后面的?表示最小模式匹配(非贪心的),然后跟字母e
print(re.findall(r'i.*?e',s))
print("------------------------------------------.*?.*?.*?结束")


#{m,n}  :表示至少有 m 个重复,至多有 n 个重复 。 m,n均为十进制数
#忽略m表示0个重复,忽略n表示无穷多个重复。
#{n}$表示可以出现的次数
#{0,} 等同于 *       {1,}等同于 +      {0,1}与 ?相同。但是如果可以的话,最好使用* + ?
s = 'a b baaaaba'
print(re.findall(r'a{1,3}',s))
s = '021-33507yyx,021-33507865,010-12345678,021-123456789'
print(re.findall(r'021-d{8}',s))
print(re.findall(r'021-d{8}',s))
print("------------------------------------------{}{}{}{}结束")


#练习
#随机生成10个长度为1-25之间,由字母、数字、和_  .  #  % 特殊字母组成的字符串构成列表,
#找出列表符合下列要求的字符串:长度为5-20,必须以字母开头、可带数字或 _ .
import string,random
z = []
x = string.ascii_letters+string.digits+"_.#%"
for i in range(10):
    y = [random.choice(x) for i in range(random.randint(1,25))]
    z.append(''.join(y)) #join把列表的元素,转为字符串,''是为了合并字符串
print('列表:',z)
print('满足要求的字符串是:')

r = r'^[a-zA-Z]{1}[a-zA-Z0-9._]{4,19}$' #条件
for i in z:
    if re.findall(r,i):
        print(i)
原文地址:https://www.cnblogs.com/unlasting/p/12840477.html