学习正则表达式

今天学习的内容,贴在这里,用作参考。

import re

#15.3.8 创建字符合集([])
patt = "\w+@(\w+\.)?\w+\.com"   #\.是对句点转义,转义后,就是正常的句点,而非正则表达式的匹配符号。
#这个复杂的pattern可以匹配两种类型的邮箱。
a = re.match(patt, "nobody@xxx.com").group()
print(a)
#运行结果:nobody@xxx.com
b = re.match(patt, "nobody@www.xxx.com").group()
print(b)
#运行结果:nobody@www.xxx.com
#一个简单电子邮件的正则表达式('\w+@\w+.com")
# \w相当于[A-Za-z0-9_]

#闭包操作符(*,+,?,{})实现多次出现/重复匹配
#"*"匹配前一个字符0次或无限次。abc* 可匹配 ab 或者 abcccc。
#"+"匹配前一个字符1次或无限次。abc+ 可匹配 abc 或者 abcccc。
#"?"匹配前一个字符0次或1次。 abc? 可匹配ab 或则 abc。
#{m}匹配前一个字符m次。ab{2}c

p = "a(123|456)c"
q = re.match(p, 'a456c').group()
print(q)
# 用圆括号()来创建分组,后可跟上面提到的闭包操作符,来重复子组重复的次数。
# eg. (abc){2} 即重复匹配(abc)两次,即要匹配abcabc

c = re.match("\w\w\w-\d\d\d", "abc-123").group()
print(c)
#运行结果: abc-123
# "\w" == [A-Za-z0-9_]; "\d"== [0-9]

# d = re.match('\w\w\w-\d\d\d', 'abc-xyz').group()
# print(d)
#运行结果: AttributeError: 'NoneType' object has no attribute 'group'

e = re.match("(\w\w\w)-(\d\d\d)", "abc-123")
print(e.group())
#运行结果: abc-123
print(e.group(1))
#运行结果:abc
print(e.group(2))
#运行结果:123
print(e.groups())
#运行结果为元组:('abc', '123')

f = re.match("ab", 'ab') #无子组
print(f.group())  #完全匹配
#运行结果:ab
print(f.groups())  #所有匹配的子组
#运行结果:()

g = re.match('(ab)', "ab") #一个子组 是只括号里的
print(g.group()) #匹配所有子组得到的结果
#运行结果:ab
print(g.group(1))   #匹配子组1
#运行结果:ab
print(g.groups())  #所有匹配的子组
#运行结果:('ab')

i = re.match('(a)(b)', "abc") #两个子组
print(i.group()) #匹配所有子组得到的结果
#运行结果:ab
print(i.group(1))  #匹配子组1
#运行结果:a
print(i.group(2))  #匹配子组2
#运行结果: b
print(i.groups())  #所有匹配的子组
#运行结果:('a', 'b')

j = re.match("(a(b))", 'ab') #两个子组
print(j.group())
#结果:ab
print(j.group(1)) #匹配第一个子组
#结果:ab
print(j.group(2)) #匹配第二个子组
#结果:b
print(j.groups()) #所有匹配的子组
#结果:("ab","b")

#15.3.10 从字符串的开头或结尾匹配及在单词边界上的匹配
#下面的列子展示了锚点性正则表达式的操作符。
#这些操作符不是用来匹配,而是用来搜索的。
#因为match总是从第一个字符串开始匹配。

k = re.search('^The', "The end.") #^从首个字符开始匹配
print(k.group())
#运行结果: The
# l = re.search('^The',"end. The")  # 首个字母不匹配
# print(l.group())
#运行结果:
# AttributeError: 'NoneType' object has no attribute 'group'

#字符串前面加了r,是raw的意思,它表示对字符串不进行转义,
# 不理会任何转义字符串,如"\n"等
o = re.search(r'\bthe', "bite the dog")  #在词边界
print(o.group())
# \b在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割。
# 而\b自身又不会匹配任何字符,它代表的只是一个位置。

# p = re.search(r'\bthe', "bitethedog")  要找以the 开头的单词,找不到与匹配条件相符的字符串。
# print(p.group())
# 运行结果:AttributeError: 'NoneType' object has no attribute 'group'

# p = re.search(r'/bthe', "bitethe dog") 找不到的原因同上
# print(p.group())
#运行结果:AttributeError: 'NoneType' object has no attribute 'group'

p = re.search(r'\Bthe', "bitethe dog")  # \B表示不是单词开头和结尾的位置
print(p.group())
#运行结果:the

q = re.search(r'\Be', "bitethe dog")  # \B表示不是单词开头和结尾的位置
print(q.group())

# 15.3.11 用findall()找到每个出现的匹配部分
r = re.findall('cars', 'car')
print(r)
#运行结果: ['car']
#findall总会返回一个列表,不需要用.group().
# 如果findall()没有找到匹配的部分,则会返回空列表 []
r1 = re.findall('(ca(r))', 'car')
print(r1)
# 运行结果:[('car', 'r')]
#如果成功匹配,则会返回所有匹配部分的列表(按从左往右的顺序)

# 15.3.12 用sub()(和subn())进行搜索和替换
a = re.sub("X", "Mr. Smith", 'attn: X\n\nDear X, \n')
print(a)

text = "JGood is a handsome boy, he is cool, clever."
print(re.sub(r'\s+', '-', text))
#运行结果:JGood-is-a-handsome-boy,-he-is-cool,-clever.
# re.sub的函数原型为:re.sub(pattern, repl, string, count)

b = re.sub('[ae]', "X", "abcde")
print(b)
#运行结果: XbcdX

c = re.subn(r'abc|d', "X", "abcde")
print(c)
#运行结果: ('XXe', 2)
# subn()和sub()一样,但它还返回一个表示替换次数的数字,
# 替换后的字符串和替换次数作为一个元组的元素返回。


#15.3.13 用split()分割(分隔模式)
#re.slipt(pattern,text,maxsplit)将文本以pattern为标准分割为一个列表。

m = re.split("\d+", "123abc321cba")  #不保留匹配项
print(m)
#运行结果:['', 'abc', 'cba']

n = re.split('(\d+)',"123abc321cba")  #保留匹配项
print(n)
#运行结果:['', '123', 'abc', '321', 'cba']

o = re.split('\W+', "Words, word, word") #\W 以非单词字符作为分隔模式。
print(o)
#运行结果: ['Words', 'word', 'word']

p = re.split("a", "bbb")
print(p)
#运行结果:['bbb']
#如果文本不能被分隔,则将以列表方式返回整个文本。


#f = re.match('\bblow', 'blow')
#print(f.group())
#运行结果:AttributeError: 'NoneType' object has no attribute 'group'
#没有找到匹配对象
#因为ASCII字符和正则表达式的特殊符号间有冲突,\b在ASCII中表示退格键。
#但在正则表达式中\b 表示单词的边界。
#为了表示正则表达式的边界\b需要写成 \\b. 用\对\b进行转义。
f = re.match('\\bblow', 'blow')
print(f.group())
#不过更推荐的方法是该用原始字符串
#(r'\bblow', 'blow')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值