无法使txt文件中的字符串完全匹配

时间:2011-01-04 13:11:24

标签: python regex

我通过阅读你的帖子解决了很多问题,但现在我陷入了以下困境。

我的问题是我不能在我的txt文件中对给定单词进行绝对匹配。 我写了以下内容:

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','脏'

中找到了脏字   

但我也得到了:

  
    

在第'-0.5'行中发现脏字,'脏兮兮的'

         

在“-0.625”,“脏脸”

中找到了脏字   

我只想获得完全匹配,仅此而已! 请帮忙吗?

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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 :(得分:0)

首先,从\b切换到检查字边界为[^-a-zA-Z],因为-计为字边界。其次,如果您排长队,请考虑先使用in关键字:

if word in line and pattern.search(line):

这样python可以在部署正则表达式引擎之前先快速匹配单词的字母。对于大多数行根本不匹配的大型文件,应该加快速度。

第三,修复代码示例 - 打印line将打印行内容,而打印n(或更好的是`n`转换为字符串。)

第四,考虑改用grep:

grep -nwf needles_on_separate_lines haystack.txt

哪个会做你想要的,而且比Python快得多。

答案 3 :(得分:0)

您的问题是\b匹配字边界。这些被定义为“字母数字字符和非字母数字字符之间的位置”。

因此\bdirty\b将匹配字符串dirty中的This is dirty!,但不会匹配dirtying your clothes中的-。到目前为止一切顺利,但由于\b也是一个非字母数字字符,dirty-minded也会在您观察到的r"(?<!-)\b%s\b(?!-)" % word 时触发。

因此,您需要考虑的是您不希望将哪些字符用作单词分隔符。如果它只是破折号,你可以添加另一对断言来排除它们:

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

如果要添加更多字符以排除为有效字边界,例如撇号,请使用字符类:

{{1}}