Python 要匹配重复(未知)子字符串的正则表达式

Python 要匹配重复(未知)子字符串的正则表达式,python,arrays,regex,Python,Arrays,Regex,我试图在用户消息中找到“笑词”或类似的词,如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]*('

我试图在用户消息中找到“笑词”或类似的词,如
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]*
在拼写错误(例如,
ahahahah
)方面提供了一些余地。从原则上讲,这相当有效。问题在于,它需要在某种意义上进行维护,
substring\u list
需要更新,以匹配新形式的“笑词”(例如,添加
xi
);“笑词”似乎在不同的国家之间差异很大

现在我想知道,我是否能在不知道单个模式的情况下,根据重复模式(大小,比如2-4)找到单词。例如,
hurrhurr
包含作为重复模式的
hurr
。在理想情况下,我可以(a)匹配
hurrhurr
,(b)识别核心模式
hurr
。我不知道正则表达式是否可以做到这一点。

这个正则表达式可以做到:

\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)

要点与您所做的相似,但“核心”不同。regex的核心是这一块:

([a-z]{2,}?)\1+
逻辑是找到由2个或多个字母组成的组,然后再将同一组(
\1
)匹配一次或多次

在理想情况下,我可以(a)匹配hurrhurr和(b)识别核心 赫勒。我不知道正则表达式是否可以做到这一点


您的子字符串列表当前与
hurrhur
匹配,因为
hu
已经定义。@l'l'l注意到有一个
{2,}
量词重复该组。@Mariano:我应该注意到什么?@l'l它不会与
hurrhur
匹配,因为
hu
没有连续重复2次以上,接受的答案过于复杂,与不应该匹配的内容匹配,并且没有提供所需的输出。例如,
heehee
hurrhurr
,这将不匹配。但是,如果我想象它会与
香蕉相配。这似乎是错误的@Mariano,是的,它会的。@7stud我知道你已经修改了正则表达式,但是如果我想象
香蕉
(或者,正如Mariano所说,
----
x主题
),它仍然会匹配
)。看,Ed,这很有效!引用组的概念
\1
是缺少的部分。我现在如何使用它来提取重复模式“hurr”?如“查找重复的模式,并返回第一个外观”。@Christian使用
re.findall
,然后访问结果,如
results=re.findall(模式、字符串、re.IGNORECASE)print(结果)
。这里有一个演示:@BobbleBobble很好。那是我玩的其他东西的遗留物。固定的!
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')]