Regex在python中查找任意顺序的模式

2024-09-28 19:09:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我四处寻找,但找不到答案。你知道吗

我想找一个3个字母的模式,其中2个字母应该是D或E,第三个字母可以是任何东西。顺序也不重要。你知道吗

例如:DEA或ESD或DZE或PDE都应该匹配。 对于像这样的示例字符串“ededededede”,还应该检测重叠模式,因此“EDE”、“DED”、“EDE”、“DED”、“EDA”、“DAD”、“ADE”、“DED”、“EDE”都应该在搜索中。你知道吗

我能想到的是:[A-Z][DE]{2}|[DE][A-Z][DE]|[DE]{2}[A-Z]但这看起来很笨拙。有更简单的解决方案吗?你知道吗

谢谢。你知道吗


Tags: 字符串答案示例顺序字母模式deeda
3条回答

怎么样:

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

试试这个模式(?=[^\s]{0,2}D)(?=[^\s]{0,2}E)...

它首先确保后面是一个包含DE的单词(除空格外的字符串,由nagativa字符类[^\s]实现)。你知道吗

每个字母都有单独的正面展望:

  • (?=[^\s]{0,2}D)对于D
  • (?=[^\s]{0,2}E)表示E。你知道吗

如果满足这些条件,则用...匹配三个字符。你知道吗

Demo

你不需要正则表达式;没有正则表达式可读性更好。你知道吗

valid = ("D" in s) and ("E" in s)

如果您还需要验证长度,只需在检查字母之前保持len(s) == 3。你知道吗

如果需要使用regex,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

Edit:请注意,这假设字符串中必须同时存在D和E,这与提供的示例相匹配,但不是真正的问题语句,前提是问题语句并不完全准确。

相关问题 更多 >