首页 > 解决方案 > 用于搜索特定子字符串的正则表达式

问题描述

我试过这段代码:

re.findall(r"d.*?c", "dcc")

搜索第一个字母 d 和最后一个字母 c 的子字符串。

但我得到输出['dc']

正确的输出应该是['dc', 'dcc'].

我做错了什么?

标签: pythonregex

解决方案


您的两个问题.*是贪婪而.*?最小,并且 re.findall() 仅返回不重叠的匹配项。这是一个可能的解决方案:

def findall_inner(expr, text):
    explore = list(re.findall(expr, text))
    matches = set()
    while explore:
        word = explore.pop()
        if len(word) >= 2 and word not in matches:
            explore.extend(re.findall(expr, word[1:])) # try more removing first letter
            explore.extend(re.findall(expr, word[:-1])) # try more removing last letter
        matches.add(word)
    return list(matches)

found = findall_inner(r"d.*c", "dcc")
print(found)

这有点矫枉过正,使用 findall 而不是 search 和使用>= 2instead of > 2,因为在这种情况下,只能有一个不重叠的匹配 ofd.*c并且一个字符串不能匹配模式。但是它有一些灵活性,具体取决于您可能想要的其他类型的模式。


推荐阅读