无法在文本文件中精确匹配字符串
我通过阅读你们的帖子解决了很多问题,但现在我遇到了麻烦。
我的问题是,我无法在我的文本文件中找到一个给定单词的绝对匹配。
我写了以下代码:
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
中就匹配不到。到这里都没问题,但因为 -
也是一个非字母数字字符,所以 \b
在 dirty-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))