python字符串搜索与匹配

作者: 小奚有话说 | 来源:发表于2017-08-25 15:04 被阅读125次

字符串是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
  1. 使用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可能更简洁,更有效。

  1. 匹配或搜索指定文本
  • 如果你想匹配的是字面字符串,直接用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(),其实下面这两种情况是等同的:

# 使用compile
prog = re.compile(pattern)
result = prog.match(string)
# 直接使用match
result = 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()编译正则表达式,然后进行匹配或搜索。


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

相关文章

  • python字符串搜索与匹配

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

  • 【2017-08-23】字符串及文本的处理(二)

    字符串的搜索与替换 匹配或搜索特定模式的文本字符串方法str.find(substr) 主要为查找字符串中是否出...

  • 【Python进阶】2.4字符串匹配和搜索

    2.4 字符串匹配和搜索 问题 你想匹配或者搜索特定模式的文本 解决方案 如果你想匹配的是字面字符串,那么你通常只...

  • 11.正则表达式(二)

    目录:1.模块介绍2.单次匹配3.全文搜索4.匹配替换5.分割字符串6.分组 1.模块介绍 Python使用re模...

  • 正则表达式语法

    “正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串。该表达式可用作一个将字符模式与要搜索的字符串相匹配的模...

  • 正则表达式

    作用:用来匹配字符串。 在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配。 格式-...

  • Python -- 正则表达式 regular express

    作用:用来匹配字符串。 在Python中,正则表达式是特殊的字符序列,检查一个字符串是否与某种模式匹配。 格式-...

  • Fiddler 与Charles接口代理

    Fiddler 匹配规则 前缀为“EXACT:”表示完全匹配(大小写敏感)无前缀表示基本搜索,表示搜索到字符串就匹...

  • 正则表达式初窥

    搜索字符串 match从头匹配 search匹配一次 findall查询所有 【finditer 迭代器形式...

  • iOS - 搜索关键字在结果中高亮显示

    支持搜索的内容拆分为单个字符串与整体的数据进行比较 搜索的内容不进行拆分,直接匹配有则显示

网友评论

    本文标题:python字符串搜索与匹配

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