我正在尝试在用户消息中找到“笑话”或类似内容,例如hahaha
,hihihi
,hueheu
。我目前的做法如下:
>>> substring_list = ['ha', 'ah', 'he', 'eh', 'hi', 'ih', 'ho', 'hu', 'hue']
>>> pattern_core = '|'.join(substring_list)
>>> self.regex_pattern = re.compile(r'\b[a-z]*(' + pattern_core + r'){2,}[a-z]*\b', re.IGNORECASE)
[a-z]*
允许在拼写错误时留有余地(例如ahhahah
)。原则上,这种方法运作得相当好。问题在于需要维护substring_list
需要更新以匹配新形式的“笑声词”(例如,添加xi
); “笑声”似乎在各国之间变得非常明显。
现在我想知道我是否可以在不知道单独模式的情况下以某种方式找到基于重复模式(大小,比如2-4)的单词。例如,hurrhurr
包含hurr
作为重复模式。在理想情况下,我可以(a)匹配hurrhurr
和(b)识别核心模式hurr
。我不知道这是否可以用正则表达式。
答案 0 :(得分:5)
这个正则表达式会这样做:
\b[a-z]*?([a-z]{2,}?)\1+[a-z]*?\b
用法:
self.regex_pattern = re.compile(r'\b[a-z]*?([a-z]{2,}?)\1+[a-z]*?\b', re.IGNORECASE)
要点与你所做的相似,但“核心”是不同的。正则表达式的核心是这件作品:
([a-z]{2,}?)\1+
逻辑是找到一个由2个或更多字母组成的组,然后再一次或多次匹配同一组(\1
)。
答案 1 :(得分:0)
在理想情况下,我可以(a)匹配hurrhurr和(b)识别核心 模式冲击。我不知道这是否可以用正则表达式。
import re
string = """hahaha, huehue, heehee,
axaxaxax, x the theme, ------, hhxhhxhhx,
bananas, if I imagine, HahHaH"""
pattern = r"""
(
\b #Match a word boundary...
(
[a-z]{2,}? #Followed by a letter, 2 or more times, non-greedy...
) #Captured in group 2,
\2+ #Followed by whatever matched group 2, one or more times...
\b #Followed by a word boundary.
) #Capture in group 1.
"""
results = re.findall(pattern, string, re.X|re.I)
print(results)
--output:--
[('hahaha', 'ha'), ('huehue', 'hue'), ('heehee', 'hee'), ('axaxaxax', 'ax'), ('hhxhhxhhx', 'hhx'), ('HahHaH', 'Hah')]