【问题标题】:wrong output in search file for word code搜索文件中的单词代码输出错误
【发布时间】:2013-12-21 22:11:17
【问题描述】:

我有这个代码来搜索文件中的单词(而不是子字符串)并返回找到单词的行:

def word_search(word, file):
    pattern = re.compile(r'\b{}\b'.format(re.escape(word), flags=re.IGNORECASE))
    return (item for item in file
        if pattern.match(item) == -1)

但是这段代码(几乎)归还了一切。我究竟做错了什么? 感谢您的关注

这是代码:

sentences = re.split(r' *[\.\?!][\'"\)\]]* ]* *', text) # to split the file into sentences

def finding(word, file):
    pattern = re.compile(r'\b{}\b'.format(re.escape(word)), flags=re.IGNORECASE)
    return (item for item in file if pattern.search(item))   # your suggestion

from itertools import chain # I'm plannig on using more words, and  I dont want duplicate       #sentences. Thats why i use the chain + set. 
chain = chain.from_iterable([finding('you', sentences), finding('us', sentences)])

plural_set = set(chain)

for sentence in plural_set:
        outfile.write(sentence+'\r\n')

这给了我你在下面看到的结果。

这是测试文件的内容:

“好吧,沃伦夫人,我看不出你有什么特别的原因 因为不安,我也不明白为什么我,谁的时间是一些 值,应该干涉此事。我真的有其他事情要做 跟我来。” 夏洛克·福尔摩斯这么说,转身面对伟大的 剪贴簿,他在其中整理和索引他最近的一些 材料。

但是女房东有她的性别的顽固和狡猾。 她坚定地坚持自己的立场。

“你去年为我的一个房客安排了婚外情,”她 说——“费尔代尔·霍布斯先生。”

“啊,是的——很简单的事情。”

“但他永远不会停止谈论它——您的好意,先生,以及 你将光明带入黑暗的方式。我想起了他的 当我自己处于怀疑和黑暗中时的话。我知道你可以 你只会。”

福尔摩斯在奉承方面很容易接近,而且,为了他 正义,站在善良一边。两股力量让他躺下 无奈地叹了口气,放下他的口香糖刷子,把椅子往后一推。

以及代码返回的内容:

沃伦,我看不出你有什么特别的理由 不安,我也不明白为什么我,我的时间是有价值的, 应该干涉这件事 夏洛克·福尔摩斯这么说并转身 回到他正在整理和索引的伟大剪贴簿 他最近的一些材料。

但是女房东有她的性别的顽固和狡猾。 她坚定地坚持自己的立场。

“你去年为我的一个房客安排了婚外情,”她 说——“费尔代尔·霍布斯先生。”

“啊,是的——很简单的事情。”

“但他永远不会停止谈论它——您的好意,先生,以及 你把光明带入黑暗的方式我知道如果你能做到 你只会。”

福尔摩斯在奉承方面很容易接近,而且,为了他 正义,站在善良一边

【问题讨论】:

    标签: python regex function


    【解决方案1】:

    有三个错误:

    1. 当正则表达式匹配失败时,匹配函数返回None,而不是-1
    2. 如果要匹配整个字符串而不是字符串开头,则需要使用 re.search() 而不是 re.match()
    3. 您需要在正确的位置提供flags 参数:

    所以应该是这样的:

    def word_search(word, file):
        pattern = re.compile(r'\b{}\b'.format(re.escape(word)), flags=re.IGNORECASE)
        return (item for item in file if pattern.search(item))
    

    让我们看看它的实际效果:

    >>> file = ["It's us or them.\n",
    ... '"Ah, yes--a simple matter."\n',
    ... 'Could you hold that for me?\n',
    ... 'Holmes was accessible upon the side of flattery, and also, to do him justice, upon the side of kindliness.\n',
    ... 'Trust your instincts.\n']
    >>> list(word_search("us", file))
    ["It's us or them.\n"]
    >>> list(word_search("you", file))
    ['Could you hold that for me?\n']
    

    【讨论】:

    • 另外,flags=re.IGNORECASE 应该是 re.compile() 的参数,而不是 str.format()
    • @Tim P. Thx。现在效果更好(我得到的结果少了很多)。但仍然句子不包含我正在搜索的任何单词。谢谢你的建议!
    • @user3119123:有这样一行(以及您要搜索的词)的示例吗?
    • @ Tim P. 所以经过一些测试,我有一个例子。该代码适用于包含 5 个句子的文件。但是在一个稍微大一点的文件上,我得到了这个更大的句子。 (在帖子中编辑)。它有点晚了,所以我要到明天才能检查。再次感谢您的关注,不胜感激!
    • 是的,拆分没有正确拆分句子,因此单个拆分结果中可能包含多个句子。我认为您还应该沿换行符拆分,并避免在引号内拆分(您的正则表达式似乎正在尝试这样做,但失败了)。更好的解决方案可能涉及 NLTK,因为使用纯正则表达式即使不是不可能,也很难进行句子解析。
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多