Python 带重复字的正则表达式模式计数
我尝试编写一个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
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)
,但这使得不区分大小写的搜索更加困难。