无法在文本文件中精确匹配字符串

0 投票
4 回答
1306 浏览
提问于 2025-04-16 09:23

我通过阅读你们的帖子解决了很多问题,但现在我遇到了麻烦。

我的问题是,我无法在我的文本文件中找到一个给定单词的绝对匹配。

我写了以下代码:

for word in listtweet:
    #print word,
    pattern=re.compile(r'\b%s\b' %(word))
    with open('testsentiwords_fullTotal_clean1712.txt', 'r') as f:
        for n,line in enumerate(f):
            if pattern.search(line):
                    print 'found word: ', word, 'in line ', line

我的输出部分正确:

在行 '-0.458333333333' 找到单词 dirty,'dirty'

但我也得到了:

在行 '-0.5' 找到单词 dirty,'dirty-minded'

在行 '-0.625' 找到单词 dirty,'dirty-faced'

我只想得到完全匹配的结果,其他的都不要!请帮帮我!

4 个回答

0

你的问题在于 \b 是用来匹配单词边界的。单词边界的定义是“一个字母数字字符和一个非字母数字字符之间的位置”。

所以 \bdirty\b 会在字符串 This is dirty! 中匹配到 dirty,但在 dirtying your clothes 中就匹配不到。到这里都没问题,但因为 - 也是一个非字母数字字符,所以 \bdirty-minded 中也会触发,这正是你观察到的情况。

因此,你需要考虑一下哪些字符是不希望作为单词分隔符的。如果你只想排除短横线,可以再加一对条件来排除它们:

r"(?<!-)\b%s\b(?!-)" % word

如果你想排除更多的字符,比如撇号,可以使用字符类来实现:

r"(?<!['-])\b%s\b(?!['-])" % word
0

如果你提供的打印输出显示了文件中的实际行(而你要找的那个词总是用单引号括起来),我觉得你的正则表达式应该像这样:

p = re.compile(r"'%s'" % target_word)

所以结果会像这样:

>>> p = re.compile(r"'%s'" % "dirty")
>>> p.search("'12345', 'dirty'")
<_sre.SRE_Match object at 0x631b10>
>>> p.search("'12345', 'dirty-faced'")
>>> 
2

试试这个模式:

pattern=re.compile(r'[^-a-zA-Z]%s[^-a-zA-Z]' %(word))

你这个模式的问题在于 '-' 这个字符在 \b 里面。

如果你想在你的字符串中包含数字,可以把 0-9 加到这个模式里。

pattern=re.compile(r'[^-a-zA-Z0-9]%s[^-a-zA-Z0-9]' %(word))

撰写回答