【问题标题】:Python: Regex a dictionary using user input wildcardsPython:使用用户输入通配符正则表达式字典
【发布时间】:2013-04-04 20:56:29
【问题描述】:

我希望能够使用用户输入通配符在 Python 中搜索字典。

我找到了这个:

import fnmatch
lst = ['this','is','just','a','test', 'thing']
filtered = fnmatch.filter(lst, 'th*')

这符合这个和东西。现在,如果我尝试输入整个文件并搜索

with open('testfilefolder/wssnt10.txt') as f:
 file_contents = f.read().lower()
 filtered = fnmatch.filter(file_contents, 'th*')

这不匹配任何东西。不同之处在于,在我正在读取的文件中,我是一个文本文件(莎士比亚戏剧),所以我有空格,它不是一个列表。我可以匹配诸如单个字母之类的东西,所以如果我只有“t”,那么我会得到一堆 t。所以这告诉我我正在匹配单个字母 - 但是我想要匹配整个单词 - 但更重要的是,要保留通配符结构。

因为我希望用户输入文本(包括将成为通配符的内容),我可以将其替换为“th*”所在的位置。外卡会做它应该做的事情。这就引出了一个问题,我可以只插入一个变量来保存“th*”的搜索文本吗?经过一番调查,我想知道我是否应该以某种方式翻译“th*”并找到诸如:

regex = fnmatch.translate('th*')
print(regex)

输出th.*\Z(?ms)

这是正确的做法吗?不知道有没有必要。

关于“传递正则表达式”的最佳方法是什么,以及我在代码中的错误的想法,因为它没有对第二组代码中的传入文本字符串进行操作它(正确地)在第一个。

【问题讨论】:

  • 你为什么不直接使用re?

标签: python regex python-3.x wildcard file-handling


【解决方案1】:

如果问题只是你“有空格而不是列表”,为什么不把它变成一个列表呢?

with open('testfilefolder/wssnt10.txt') as f:
 file_contents = f.read().lower().split(' ') # split line on spaces to make a list
 filtered = fnmatch.filter(file_contents, 'th*')

【讨论】:

  • 感谢克里斯。首先,我正在尝试学习如何用 Python 编写这些东西(我很新),但我什至不确定最终是否应该,因为我将组合数千个文件。列表对我来说听起来不错,但我很想知道这是否是最佳选择。再次感谢,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多