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')]