美文网首页
2019-06-19正则表达式

2019-06-19正则表达式

作者: hcc_9bf4 | 来源:发表于2019-06-19 21:22 被阅读0次

为什么引入正则表达式?

  • 用来匹配一类具有相同规则的字符串
    正则分正则替换和正则匹配
    规则:
    PS:不要试图去看懂别人的正则,在一个特定的情况下我们只需自己完成自己需求的功能就好了
  • 单字符:
    【.】: 除换行以外所有的字符
    【[ ]】:[aoe], [a-w]匹配集合中任意一个字符
    【\d】:数字0~9
    【\D】:非数字
    【\w】:数字,字母,下划线,中文
    【\W】:非\w
    【\s】:所有的空白字符
    【\S】:非空白
  • 数量修饰(控制次数)
    【*】:任意多次 >=0
    【+】:至少一次 >=1
    【?】: 可有可无 0次或者1次
    【{m}】:固定m次
    【{m,}】:至少m次
    【{m,n}】:m到n次
  • 边界
    【\b】
    【\B】
    【$】:以某某结尾
    【^】:以某某开头
  • 分组
    【()】视为一个整体 (){4}--->ab{4}和(ab){4}区别
    【()】子模式 \组模式 \1 \2
import re
string='<p><div><span>猪八戒</span></div></p>'
pattern=re.compile(r'<(\w+)><(\w+)>\w+</\2></\1>')
ret=pattern.search(string)
print(ret)

显示:

<re.Match object; span=(3, 30), match='<div><span>猪八戒</span></div>'>
[Finished in 0.1s]
  • 贪婪模式
    【.*?】
    【.+?】
import re
string='<div>如来佛祖</div></div></div>'
pattern=re.compile(r'<div>.*</div>')

ret=pattern.search(string)

print(ret)

匹配显示:

match='<div>如来佛祖</div></div></div>'>

加?后

import re
string='<div>如来佛祖</div></div></div>'
pattern=re.compile(r'<div>.*?</div>')

ret=pattern.search(string)

print(ret)

匹配显示:

match='<div>如来佛祖</div>'>
  • 其他
  1. re.I :忽略大小写
  2. re.M :多行匹配
import re
string='''hate is beautiful feel
love you very much
love she
love her'''

pattern=re.compile(r'^love',re.M)

ret=pattern.search(string) #search方法只能找到一个

print(ret)

显示:

match='love'>

想显示多个用findall

ret=pattern.findall(string) #search方法只能找到一个

显示:

['love', 'love', 'love']
  1. re.S :单行匹配
    举例:
import re
string='''<div>沁园春-雪
北国风光
千里冰封
万里雪飘
望长城内外
惟余莽莽
大河上下
顿失滔滔
山舞银蛇
原驰蜡像
欲与天公试比高
</div>'''

pattern=re.compile(r'<div>(.*?)</div>',re.S)

ret=pattern.findall(string) 

print(ret)

显示:

['沁园春-雪\n北国风光\n千里冰封\n万里雪飘\n望长城内外\n惟余莽莽\n大河上下\n顿失滔滔\n山舞银蛇\n原驰蜡像\n欲与天公试比高\n']
[Finished in 0.1s]

匹配OK
假如把这句:

pattern=re.compile(r'<div>(.*?)</div>',re.S)

换成:

pattern=re.compile(r'<div>(\w+)</div>',re.S)

匹配失败:

[]
[Finished in 0.1s]

原因是\w+不能匹配换行符

pattern=re.compile(r'<div>(.*?)</div>',re.S)

这一句后面的re.S不加也会fail,加了后 . 点也可以匹配换行(点的含义是能匹配任何除换行以外的任何字符。加了re.S后可以匹配换行符)

  • 匹配用到函数
    match :只从最开始开始找
    search:从任意位置开始找
    findall:查找所有
  • 正则替换
    re.sub(正则表达式,替换内容,字符串)
    含义:在’字符串‘中查找‘正则匹配’到的内容替换为‘替换内容’
import re
string='i love you,you love me,ye'

pattern=re.compile(r'love')
ret=re.sub(r'love','hate',string)
# ret=re.sub(pattern,'hate',string)
# ret=pattern.sub('hate',string)#把love替换成hate

print(ret)

显示:

i hate you,you hate me,ye
[Finished in 0.1s]

替换内容可以是函数:
解释下:
正则匹配到的内容会传递给这个函数,这个函数里面可以对它进行处理,最后这个函数必须返回一个字符串,这个字符串就是正则替换的内容

举例:把175升高减10用正则替换函数实现

import re
string='我喜欢升高为175的女孩'
def fn(a):
    # print(a) #这个是正则匹配到的对象
    ret=int(a.group(0))
    return str(ret - 10)

pattern=re.compile(r'\d+')
ret=pattern.sub(fn,string)

print(ret)

打印显示:

我喜欢升高为165的女孩
[Finished in 0.1s]

相关文章

网友评论

      本文标题:2019-06-19正则表达式

      本文链接:https://www.haomeiwen.com/subject/akaqqctx.html