使用Shell通配符模式匹配字符串

问题

希望使用与在Unix shell中常用的相同通配符模式匹配文本(例如,.py,Dat [0-9].csv等)。

方案

fnmatch模块提供了两个函数fnmatch和fnmatchcase。唯一的区别是是否区分字母大小写。示例如下:

>>> from fnmatch import fnmatch, fnmatchcase
>>> fnmatch('foo.txt', '*.txt')
True
>>> fnmatch('foo.txt', '?oo.txt')
True
>>> fnmatch('Dat45.csv', 'Dat[0-9]*')
True
>>> names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py']
>>> [name for name in names if fnmatch(name, 'Dat*.csv')]
['Dat1.csv', 'Dat2.csv']
>>>

此模块提供对Unix shell样式通配符的支持,这些通配符与正则表达式(在re模块中)不同。 shell样式通配符中使用的特殊字符是:

PatternMeaning
*matches everything
?matches any single character
[seq]matches any character in seq
[!seq]matches any character not in seq

这些函数经常被忽视的一个特性是它们可能用于非文件名字符串的数据处理。 例如,假设有一个街道地址列表,如下所示:

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')]
['5412 N CLARK ST', '1060 W ADDISON ST', '2122 N CLARK ST']
>>> [addr for addr in addresses if fnmatchcase(addr, '54[0-9][0-9] *CLARK*')]
['5412 N CLARK ST']
>>>

总结

fnmatch执行的匹配介于简单字符串方法和正则表达式之间。 如果只是尝试提供一种在数据处理操作中允许使用通配符的简单机制,那么它通常是一种合理的解决方案。
如果实际上尝试编写与文件名匹配的代码,请改用glob模块。

转载于:https://www.cnblogs.com/jeffrey-yang/p/11321543.html

### 回答1: shell模糊匹配字符串是指使用通配符来匹配一定模式的字符串通配符包括星号(*)和问号(?),星号表示匹配任意数量的任意字符,问号表示匹配一个任意字符。在shell中,可以使用通配符来匹配文件名、路径名等。例如,使用*.txt可以匹配所有以.txt结尾的文件名。 ### 回答2: Shell模糊匹配字符串是一种在Linux系统下常用的文本匹配工具,它可以在文件名及目录名等文本中查找指定模式的字符或字符串。在Shell中,我们可以使用特殊符号来表示不确定的字符或者字符串,从而进行模糊匹配。 常用的模糊匹配符号有*、?、[ ]和{ }。 *表示匹配任意个字符,即可代表任意长度的字符串。例如,如果我们想要匹配所有以“abc”开头的文件名,可以使用如下命令: ls abc* ?表示匹配一个任意字符,即可代表一个字符。例如,我们想要查找名字中包含一个字符、后面跟着“2019”的文件名,可以使用如下命令: ls ?2019 [ ]表示匹配一个范围内的字符,即可代表指定范围内的任意字符。例如,我们想要查找名字中包含“a”或“b”的文件名,可以使用如下命令: ls *[ab]* {}可以用来匹配一组字符串中的任意一个,即可代表多个字符或字符串。例如,我们想要查找名字中包含“abc”或“efg”的文件名,可以使用如下命令: ls {abc,efg}* 总的来说,Shell模糊匹配字符串是一种强大灵活的文本搜索工具,可以帮助我们快速准确地找到所需的文件名或目录名,提高工作效率。但是,需要注意的是,模糊匹配也可能会匹配到一些不需要的文件或目录,因此需要谨慎使用。 ### 回答3: 在Linux系统中,Shell是一个重要的命令解析器,它负责命令行的解析和执行。在Shell中,我们可以使用模糊匹配字符串来匹配一组文件名,以便更快地进行操作。 Shell支持三种模糊匹配字符串方式:通配符、正则表达式和glob模式匹配。 1. 通配符 通配符可以匹配一个或多个字符,最常见的通配符是星号(*)和问号(?)。 *:匹配0个或多个字符 ?:匹配单个字符 例如,要列出所有以“.txt”结尾的文件,可以使用以下命令: ``` ls *.txt ``` 这将列出所有以“.txt”结尾的文件名。 2. 正则表达式 正则表达式是一种强大的文本匹配工具,它可以使用特定的语法来匹配字符串。在Shell中,我们可以使用grep命令来支持正则表达式。 例如,要查找所有以字母“A”开头和字母“Z”结尾的文件,可以使用以下命令: ``` ls | grep '^A.*Z$' ``` 这将列出所有文件名以字母“A”开头和字母“Z”结尾的文件。 3. Glob模式匹配 Glob模式匹配是一种通配符的扩展,它可以使用通配符相似的语法来匹配字符串。在Shell中,我们可以使用bash shell的扩展功能和Brace扩展来支持Glob模式匹配。 例如,要列出所有值为1、2、3或4的文件,可以使用以下命令: ``` ls {1,2,3,4}.* ``` 这将列出所有以1、2、3或4开头的文件名。 综上所述,Shell模糊匹配字符串是我们日常运维工作中常用的技巧,可以帮助我们更快速地查找文件、过滤信息等。无论是通配符还是正则表达式,我们都应该根据需求选择合适的方式,熟练掌握这些技巧,可以让我们更高效地完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值