自学内容网 自学内容网

第三十五回 梁山泊吴用举戴宗 揭阳岭宋江逢李俊-python中用Shell通配符匹配字符串

宋江被抓住,判脊杖二十,刺配江州牢城。临走时宋太公专门叮嘱他不要入伙梁山。

宋江和差人专门挑小路走,想避开梁山,结果还是被赤发鬼刘唐守到了。大家把宋江请上山,都参拜了宋江。看宋江执意要走,吴用说自己有个好朋友在江州做押牢节级,叫戴宗,人称神行太保,到时候可以照应下。

又行了半个月,来到揭阳岭,三人到酒店里吃酒,结果被放倒了。正巧混江龙李俊来寻宋江,这才救了宋江一命。李俊还介绍了出洞蛟童威和翻江蜃童猛两兄弟,以及店家催命判官李立给宋江认识。

在宋江的冒险旅程中,他不断遇到各种挑战和机遇。就像在计算机编程中,我们也需要处理各种复杂的情况,比如python使用Shell通配符来匹配字符串。

python用Shell通配符匹配字符串

问题

你想使用 Unix Shell 中常用的通配符(比如 *.py , Dat[0-9]*.csv 等)去匹配文本字符串

解决方案

fnmatch 模块提供了两个函数—— fnmatch()fnmatchcase() ,可以用来实现这样的匹配。用法如下:

from fnmatch import fnmatch, fnmatchcase
print(fnmatch('foo.txt', '*.txt'))

print(fnmatch('foo.txt', '?oo.txt'))

print(fnmatch('Dat45.csv', 'Dat[0-9]*'))

names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py']
[name for name in names if fnmatch(name, 'Dat*.csv')]

fnmatch() 函数使用底层操作系统的大小写敏感规则(不同的系统是不一样的)来匹配模式。比如在Linux系统:

>>> fnmatch('foo.txt', '*.TXT')
False

如果对这个区别很在意,可以使用 fnmatchcase() 来代替。它完全使用你的模式大小写匹配。比如:

fnmatchcase('foo.txt', '*.TXT')
False

这两个函数通常会被忽略的一个特性是在处理非文件名的字符串时候它们也是很有用的。 比如,假设有一个街道地址的列表数据,可以像这样写列表推导:

addresses = [
    '5412 N CLARK ST',
    '1060 W ADDISON ST',
    '1039 W GRANVILLE AVE',
    '2122 N CLARK ST',
    '4802 N BROADWAY',
]



from fnmatch import fnmatchcase
[addr for addr in addresses if fnmatchcase(addr, '* ST')]
# [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')]

使用glob做文件名匹配

fnmatch() 函数匹配能力介于简单的字符串方法和强大的正则表达式之间。 如果在数据处理操作中只需要简单的通配符就能完成的时候,这通常是一个比较合理的方案。

如果代码需要做文件名的匹配,也可以使用 glob 模块:

import glob  
  
# 搜索当前目录下所有以"汉"字结尾的文件或目录  
matching_paths = glob.glob('*txt')  
  
# 打印匹配到的文件或目录路径  
for path in matching_paths:  
    print(path)

 

离开揭阳岭后,三人来到了一个揭阳镇上,看见一个大汉在耍枪棒卖膏药。宋江给了五两白银,那大汉说:这么大一个揭阳镇,竟然没个识功夫的有钱人,还不如一个流放的人。这话惹恼了揭阳镇的一霸,人群里一个大汉说:哪里来的囚徒,赶来灭我们揭阳镇的威风!

欲知后市如何,且听下回分解。


原文地址:https://blog.csdn.net/skywalk8163/article/details/136150124

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!