我通过阅读你的帖子解决了很多问题,但现在我陷入了以下困境。
我的问题是我不能在我的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”,“脏脸”
中找到了脏字
我只想获得完全匹配,仅此而已! 请帮忙吗?
答案 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}}