【问题标题】:How can I create search terms with wildcards in Python?如何在 Python 中使用通配符创建搜索词?
【发布时间】:2011-08-14 03:36:56
【问题描述】:

我想检查某个词是否包含在文档中。但是,有时,该词有多种形式(复数、过去时等)。

'Hello Worlds'
'Hellos Worlds'
'Jello World'
'Hello Worlded'

如何创建一个搜索词来查找所有实例,例如

'*ello* World*'

star 是一个通配符,不一定要包含在单词中。

我找到了 fnmatch 模块的文档,但我看不出它如何帮助我搜索文档。

【问题讨论】:

  • 听起来你可能想要词干或一些 NLTK 的东西......

标签: python wildcard


【解决方案1】:

使用正则表达式并遍历文件:

import re
f=open('test.file.here', 'r')

pattern = re.compile("^[^\s]*ello[^\s]*\sWorld[^\s]*$")

for line in f:
  if pattern.match(line):
    print line,

f.close()

【讨论】:

  • 非常感谢@photoionized。这正是我想要的。
【解决方案2】:

我通常会选择正则表达式,但如果出于某种原因你想坚持使用通配符格式,你可以这样做:

from fnmatch import fnmatch

pattern = '*ello* World*'

with open('sample.txt') as file:
    for line in f:
        if fnmatch(line, pattern):
            print(line)

【讨论】:

  • "正则表达式通常更好。"是的,嗯......这就像你的意见,伙计。哈哈,我会说,当您搜索通配符无法使用的非常精确的东西时,它们会更好。对于其他一切,通配符可能更好。更容易学习,更容易编写,更容易维护。但是,嘿......这就像我的意见,伙计...... :)
  • 你说得很好!我已经编辑了帖子以淡化我的观点。
【解决方案3】:

您描述的 * 语法称为globbing。它不适用于文档,仅适用于文件和目录。正如其他人所指出的,正则表达式就是答案。

【讨论】:

  • 除了fnmatch的存在。
  • 根据docs,fnmatch 用于文件名。
  • 它大量使用“文件名”作为参数,但没有说它用于文件名。
  • 玩了一会儿之后,如果你用 * 开始和结束你的模式,它似乎会起作用
【解决方案4】:

如果您正在做任何复杂的事情,正则表达式是您的最佳选择。如果您对这些不满意,我认为对于您的具体问题,您也可以使用“in”。例如:

x = 'hello world'
if 'ello' in x and 'world' in x':
     print 'matches'
else:
     print 'does not match'

【讨论】:

    【解决方案5】:

    你可以使用正则表达式吗?

    import re
    m = re.search('\.*ello', somefile)
    

    更多:

    http://docs.python.org/library/re.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 2019-05-26
      相关资源
      最近更新 更多