我一直在搜索,但找不到答案。
我想寻找一个3字母的图案,其中2个应该是D或E,第三个可以是任何东西。而且顺序无关紧要。
例如: DEA或ESD或DZE或PDE 应该都匹配。 对于类似“ EDEDEDADEDE”的示例字符串,还应检测到重叠模式,以便“ EDE”,“ DED”,“ EDE”,“ DED”,“ EDA”,“ DAD”,“ ADE”,“ DED”,“ EDE”应该全部在搜索中。
我能想到的是:[A-Z][DE]{2}|[DE][A-Z][DE]|[DE]{2}[A-Z]
,但这似乎很笨拙。还有更简单的解决方案吗?
谢谢。
答案 0 :(得分:0)
您不需要正则表达式;没有它,可读性更强。
valid = ("D" in s) and ("E" in s)
如果您还需要验证长度,只需在字母检查前贴上len(s) == 3
。
如果需要使用正则表达式,this answer似乎已涵盖了所有细节。
import re
DE = re.compile(r"(?=.*D)(?=.*E)")
all(map(DE.match, ("DEA", "ESD", "DZE", "PDE")))
# True
all(map(DE.match, ("DEA", "ESD", "DZE", "PDE", "QQQ")))
# False
编辑:请注意,这假定字符串中同时存在D和E,并且该字符串与所提供的示例匹配,但与问题陈述并不完全相同,但前提是问题陈述并不十分准确。
答案 1 :(得分:0)
尝试此模式(?=[^\s]{0,2}D)(?=[^\s]{0,2}E)...
首先确保,接下来是一个包含[^\s]
和D
的单词(用nagetiva字符类E
实现的字符串(除空格以外的字符串)。
每个字母都有单独的正向前瞻:
(?=[^\s]{0,2}D)
代表D
,(?=[^\s]{0,2}E)
代表E
。如果满足要求,则将三个字符与...
匹配。
答案 2 :(得分:0)
怎么样:
\b(?=.?[DE].?[DE])[A-Z]{3}\b
说明:
\b : word boundary
(?= : start lookahead, zero-length assertin that make sure we have
.? : optional any character
[DE] : D or E
.? : optional any character
[DE] : D or E
) : end lookahead
[A-Z]{3} : A capital letter, must appear 3 times
\b : word boundary
查看实际效果:
https://regex101.com/r/uo7tv8/2
Python实现:
str = 'For example: DEA or ESD or DZE or PDE should all match, but not DEDE ABC DEF GHI JKL.'
regex = r"\b(?=.?[DE].?[DE])[A-Z]{3}\b"
print re.findall(regex, str)
输出:
['DEA', 'ESD', 'DZE', 'PDE', 'DEF']
str = 'ADFDFAGERASDFSAERSEDSEDEFADF'
regex = r"(?=.?[DE].?[DE])[A-Z]{3}"
print re.findall(regex, str)
输出:
['ADF', 'SED', 'SED']