我有一个搜索短语列表,其中有些是单个单词,有些是多个单词,有些之间有连字符,有些可能同时包含括号和连字符。我正在尝试处理一个文本文件目录并搜索 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))
是否有更好的方法来处理搜索中的短语范围,或者我可以对算法进行任何改进?
最佳答案
您可以使用我所说的 pythonic
单行代码来实现这一目标。
我们不需要费心使用正则表达式
,因为我们可以使用内置的 .count()
方法,该方法来自文档:
string.count(s, sub[, start[, end]])
Return the number of (non-overlapping) occurrences of substring sub in string s[start:end]. Defaults for start and end and interpretation of negative values are the same as for slices.
所以我们需要做的就是sum
总结kwlist
中每个关键字在string
ltxt
中的出现次数>。这可以通过列表理解来完成:
output.write(str(sum([ltxt.count(kws) for kws in kwlist])))
更新
正如 @voiDnyx's comment
中指出的,上述解决方案写入
所有计数
的总和
,而不是针对每个单独的关键字。
如果您想要输出各个关键字,您只需从列表
中单独编写
每个关键字即可:
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]
这取决于你,希望这对你有帮助! :)
如果您需要匹配单词边界,那么唯一的方法就是在 regex
中使用 \b
。这并不意味着您仍然不能在一行中完成此操作:
[output.write(str(len(re.findall(r'\b'+re.escape(kws)+r'\b'))) for kwlist 中的 kws]
请注意 re.escape
的必要性,因为关键字可能包含特殊
字符。
关于python - 搜索并计算文本文件中带有特殊字符的特定短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46932542/