Python 带重复字的正则表达式模式计数

Python 带重复字的正则表达式模式计数,python,regex,Python,Regex,我尝试编写一个python函数,对字符串中的特定单词进行计数 当我要计数的单词连续重复多次时,我的正则表达式模式不起作用。如果不是这样,这种模式似乎效果很好 这是我的功能 import re def word_count(word, text): return len(re.findall('(^|\s|\b)'+re.escape(word)+'(\,|\s|\b|\.|$)', text, re.IGNORECASE)) 当我用随机字符串测试它时 >>> wor

我尝试编写一个python函数,对字符串中的特定单词进行计数

当我要计数的单词连续重复多次时,我的正则表达式模式不起作用。如果不是这样,这种模式似乎效果很好

这是我的功能

import re

def word_count(word, text):
    return len(re.findall('(^|\s|\b)'+re.escape(word)+'(\,|\s|\b|\.|$)', text, re.IGNORECASE))
当我用随机字符串测试它时

>>> word_count('Linux', "Linux, Word, Linux")
2
当我要数数的单词与其相邻时

>>> word_count('Linux', "Linux Linux")
1

问题在于你的正则表达式。您的正则表达式正在使用2个捕获组,
re.findall
将返回任何可用的捕获组。需要使用
(?:…)

此外,有理由使用
(^ |\s |\b)
作为
\b
或单词边界就足够了,它涵盖了除
\b
为零宽度之外的所有情况

同样的
(\,|\s |\b |\.|$)
也可以更改为
\b

因此,您只需使用:

def word_count(word, text):
     return len(re.findall(r'\b' + re.escape(word) + r'\b', text, re.I))
这将提供:

>>> word_count('Linux', "Linux, Word, Linux")
2
>>> word_count('Linux', "Linux Linux")
2

我不确定这是否是100%,因为我不理解当您只是在寻找字符串中重复的单词时,传递要搜索的单词的函数部分。所以也许考虑……/P>
import re

pattern = r'\b(\w+)( \1\b)+'

def word_count(text):
    split_words = text.split(' ')
    count = 0
    for split_word in split_words:
        count = count + len(re.findall(pattern, text, re.IGNORECASE))
    return count

word_count('Linux Linux Linux Linux')
输出:

4
2
也许有帮助

更新:根据下面的评论

def word_count(word, text):
    count = text.count(word)
    return count

word_count('Linux', "Linux, Word, Linux")
输出:

4
2

谢谢你的回复!我只是把我的问题修改得更精确些。我想数一数一个可能连续重复多次的单词。所以word_count('Linux','Linux')将返回3。我有一个拼写错误,已经修复。这将返回
word\u count('Linux','Linux-Linux-Linux')
3
,注意
'\b'
是一个退格字符,
'\x08'
,而不是
'\\b'
OP希望“在字符串中计算特定的单词”。例如,
“Linux”
“Linux,Word,Linux”
中出现两次,因此函数应该返回2。更新了答案。也许这有用?这是计算子字符串,而不是单词。例如,
word\u count('race','racer')
是1,但应该是0。如果您真的想使用
.count
方法,您可以将字符串拆分为一个列表,例如,
re.split(r'\W+',text)
,但这使得不区分大小写的搜索更加困难。