我有一个搜索短语列表,其中一些是单个单词,一些是多个单词,一些在它们之间有连字符,其他可能有括号和连字符。我正在尝试处理文本文件目录并搜索100多个这些短语,然后计算出现次数。
看起来下面的代码在2.7x python中运行,直到它碰到带连字符的搜索短语。我在一些文本文件中观察到了至少一个带连字符的搜索短语的意外计数。
kwlist = ['phraseone', 'phrase two', 'phrase-three', 'phrase four (a-b-c) abc', 'phrase five abc', 'phrase-six abc abc']
for kws in kwlist:
s_str = kws
kw = re.findall(r"\b" + s_str +r"\b", ltxt)
count = 0
for c in kw:
if c == s_str:
count += 1
output.write(str(count))
有没有更好的方法来处理搜索中的短语范围,或者我可以对算法进行哪些改进?
答案 0 :(得分:2)
你可以通过我称之为pythonic
单行的方式实现这一目标。
我们无需费心使用regex
,因为我们可以使用内置的.count()
方法,该方法将来自文档:
<强>
string.count(s, sub[, start[, end]])
强>返回字符串s [start:end]中substring sub出现的次数(非重叠)。开始和结束的默认值以及负值的解释与切片相同。
因此,我们需要做的是sum
kwlist
string
中ltxt
中每个关键字的出现次数list-comprehension
。这可以使用output.write(str(sum([ltxt.count(kws) for kws in kwlist])))
:
writes
<强>更新强>
正如@voiDnyx's comment
所指出的,上述解决方案sum
全部counts
write
,而不是每个关键字。< / p>
如果您想要输出各个关键字,您可以list
分别counts = [ltxt.count(kws) for kws in kwlist]
for cnt in counts:
output.write(str(cnt))
分别[output.write(str(ltxt.count(kws))) for kws in kwlist]
:
\b
这会有效,但如果你想变得愚蠢并把它全部放在一行,你可能会这样做:
regex
由您决定,希望这有帮助!的:)强>
如果您需要匹配字边界,那么唯一的方法是使用re.escape
中的special
。这并不意味着你仍然不能在一行中做到这一点:
[output.write(str(len(re.findall(r'\ b'+ re.escape(kws)+ r'\ b')))kwlist中的kws]
请注意digest()
是如何必要的,因为关键字可能包含hexdigest()
个字符。