python - 搜索并计算文本文件中带有特殊字符的特定短语

标签 python string findall

我有一个搜索短语列表,其中有些是单个单词,有些是多个单词,有些之间有连字符,有些可能同时包含括号和连字符。我正在尝试处理一个文本文件目录并搜索 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/

相关文章:

python - 在文件中查找最常见的子字符串模式

python - 使用正则表达式查找包含特定表达式的句子

python - 为什么 raw_input 在此 Learn Python the Hard Way 练习变体中创建无限循环?

python - 反转字符串但将字符对放在一起

python - 使用 Flask 和 SQLAlchemy 的显式主-主数据库设置,希望使用 Flask-SQLAlchemy

c - 如何动态创建字符串数组,同时从数组条目中删除空格?

python - 如何确保 re.findall() 停在正确的位置?

Python re.findall() 返回空列表

python - SQLAlchemy 与 PostgreSQL 和全文搜索

python - 如何在 tkinter Canvas 上创建按钮?