正则表达式可在python中查找模式的任何顺序

时间:2018-10-02 03:17:30

标签: python regex

我一直在搜索,但找不到答案。

我想寻找一个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],但这似乎很笨拙。还有更简单的解决方案吗?

谢谢。

3 个答案:

答案 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

如果满足要求,则将三个字符与...匹配。

Demo

答案 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']