python字符串搜索与匹配

本文和大家分享的主要是python中字符串搜索与匹配相关内容,一起来看看吧,希望对大家学习python 有所帮助。

  字符串是python中常见的一种对象,使用的方法也很简单,只需要用引号引起来就可以看做是一个字符串。

  字符串的搜索和匹配在编程中很容易见到,这里我就简单的总结一下:

  1. 字符串自带方法匹配开头和结尾str.startswith(string)和str.endswith(string)或切片

  在start和end后面都有个s,这个很容易拼写错误。这两个函数返回值是布尔值,也就是True或False,用来判断字符串是否是以某某开头或结尾

>>> filenames = 'files.txt'

>>> filenames.startswith('file')

True

>>> filenames.endswith('.txt')

True

>>> filenames.endswith('.exe')

  False

  这两个方法还可以传入一个元组类型的参数

  >>> filenames.endswith(('.txt','.exe','.bat'))

  True

  当然上述方法,用切片也很容易做到

>>> filenames[:4] == 'file'

True

>>> filenames[-4:] == '.txt'

True

>>> filenames[-4:] == '.txt' or filenames[-3:] == 'exe'

True

  2. 使用shell通配符匹配字符串

  shell通配符

  * 匹配所有

  ? 匹配单个字符[seq] 匹配任意在seq中的字符[!seq] 匹配任意不在seq中的字符

  需要使用到fnmatch模块,该模块提供三个方法来匹配字符串,fnmatch、fnmatchcase、filter

>>> fnmatch('file.txt','*.txt')

True

>>> fnmatch('file.txt','?ile.txt')

True

>>> fnmatch('file0.txt','file[0-9]*')

True

>>> [name for name in names if fnmatch(name,'file*.txt')]

['file1.txt', 'file2.txt']

>>> filter(names,'file*.txt')

  ['file1.txt', 'file2.txt']

  fnmatch和fnmatchcase的区别就在于,fnmatch使用操作系统底层的大小写敏感原则,也就是说像windows系统,对大小写不明感的系统,匹配'txt'和'TXT'会得到同样的效果。而fnmatchcase则是对大小写敏感的。

  filter方法和[n for n in names if fnmatch(n, pattern)]一样的效果,在编写程序的时候,使用filter可能更简洁,更有效。

  3. 匹配或搜索指定文本

  ·如果你想匹配的是字面字符串,直接用find函数即可

  find函数会返回找到的第一个字符串的索引,如果没有找到会返回-1

>>> findstr = 'welcom python'

>>> findstr.find('py')

7

>>> findstr.find('to')

-1

>>> findstr.rfind('o')

11

  find函数可以从指定区间进行查找,也可以从字符串尾部进行查找rfind。

  ·如果想匹配更复杂的字符串,就需要用到正则表达式了。

  需要使用到re模块

>>> import re>>> date = '25/8/2017'

>>> m = re.match(r'\d+/\d+/\d+',date)

>>> if m:

...    print(m.group())

...

25/8/2017

  re.match只能从字符串的第一个字符进行查找,如果失败就返回None。

  如果需要从任意位置去匹配,则需要用到findall或者search

>>> today = 'today is 25/8/2017 and yesterday is 24/8/2017'

>>> datepat = re.compile(r'\d+/\d+/\d+')

>>> datepat.findall(today)

  ['25/8/2017', '24/8/2017']

  这里用到了re.compile(),其实下面这两种情况是等同的:

  # 使用compileprog = re.compile(pattern)result = prog.match(string)# 直接使用matchresult = re.match(pattern, string)

  使用search的话只会匹配第一个查找的内容:

>>> m = re.search(r'\d+/\d+/\d+',today)

>>> if m :m.group()

'25/8/2017'

  还有一个finditer则返回一个迭代器:

>>> for m in re.finditer(r'\d+/\d+/\d+',today):

...    print(m.group())

...

25/8/2017

24/8/2017

  如果需要做大量的匹配或操作的话,最好使用re.compile()编译正则表达式,然后进行匹配或搜索。

  当然正则表达式还有很多其他的用法和特性,这里暂时就不叙述了。

 

 

来源:简书


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值