当前位置: 首页 > 知识库问答 >
问题:

正则表达式,它匹配字符串中两个重复的连续字符,但不匹配三个或更多。如果aa和bbb都存在,应该匹配

谭毅然
2023-03-14

我原来的问题因为重复而被关闭了。我不同意它是重复的,因为在正则表达式语法方面,这是一个不同的用例。我试图在下面澄清我的问题。

是否可以创建一个正则表达式,该正则表达式匹配字符串中的两个重复的连续字符(在本例中为小写字母),但如果字符串的任意一侧都是相同的字符,则不匹配该字符串的某个部分。e、 g.匹配'aa',但不匹配'aaa''aaaa'

此外:

>

  • 虽然我使用的是Python 3.10,但我试图在不使用外部模块提供的附加功能的情况下,使用“标准”正则表达式语法来确定这是否可行。例如,使用Python,这意味着使用标准库中的're'模块的解决方案。

    如果有3个或3个以上重复的连续字符,则如果序列号中其他地方有两个重复的连续字符,则字符串仍应匹配。e、 g匹配'aa',即使字符串中的其他位置存在'bbb'

    如果两个重复的连续字符出现在字符串的开头或结尾,则字符串也应匹配。

    我的例子是16个字符的字符串,如果一个特定的长度有区别的话。

    ffumlmqwfcsyqpss应与'ff''ss'匹配。

    zztdcqdzdaazdjp应与'zz''dd''aa'匹配。

    urrvucyrzzzooxhx应匹配'rr''oo',即使字符串中存在'zzz'

    zettygjpcoedwyio应与'tt'匹配。

    dtfkgggvqadhqbwb不应与'ggg'匹配。

    rwgwbwzebsnjmtln不应该匹配。

    ([a-z])\1捕获重复字符,但当存在其他重复字符(如'aaa''aaaa'等)时,这也会匹配。

    ([a-z])\1(?!\1)对第三个重复字符求反,但这只会将匹配项移到重复字符串的末尾。

    消极的环顾来补偿一开始的比赛,但我认为我造成了某种循环,这种循环永远不会匹配。

    >>>import re
    
    >>>re.search(r'([a-z])\1(?!\1)', 'dtfkgggvqadhqbwb')
    <re.Match object; span=(5, 7), match='gg'> # should not match as 'gg' ('[gg]g' or 'g[gg]') 
    

    >

    如果同一个字符串中有重复的三元组等,蒂姆·比格莱森的解决方案不匹配重复对。

    在相关的问题中,Cary Swoveland的解决方案不适用于字符串开头或结尾的重复对,或者匹配,即使字符串中没有重复对。

    在链接问题中,第四只鸟的解不匹配字符串开头或结尾的重复对。

    到目前为止,唯一有效的答案是Wiktor Stribiżew,但它使用外部“regex”模块的(*SKIP)功能。使用“标准”正则表达式语法不可能实现解决方案吗?

  • 共有2个答案

    贺功
    2023-03-14

    在Pythonre中,为该任务创建正确的正则表达式的主要问题是,在使用对捕获组的反向引用之前,需要定义捕获组,而负lookbehind通常放在捕获模式之前。还有,regex101。com Python测试选项并不总是反映re库中的当前状态,当它在(?)中看到\1时,它会向用户发出这样的消息:“此令牌不能用于查找,因为它的宽度不固定或干扰模式匹配。”?

    这里可以使用的模式是

    (.)(?<!\1.)\1(?!\1)
    

    请参阅正则表达式演示。

    详细资料

    • (.)-捕获组1:任何单个字符(如果re.使用DOTALL,偶数换行符)
    • (?

    请参阅Python测试:

    import re
    tests ={'ffumlmqwfcsyqpss': ['ff','ss'],
        'zztdcqzqddaazdjp': ['zz','dd', 'aa'],
        'urrvucyrzzzooxhx': ['rr','oo'],
        'zettygjpcoedwyio': ['tt'],
        'dtfkgggvqadhqbwb': [],
        'rwgwbwzebsnjmtln': []
    }
    
    
    for test, answer in tests.items():
        matches = [m.group() for m in re.finditer(r'(.)(?<!\1.)\1(?!\1)', test, re.DOTALL)]
        if matches:
            print(f"Matches found in '{test}': {matches}. Is the answer expected? {set(matches)==set(answer)}.")
        else:
            print(f"No match found in '{test}'. Is the answer expected? {set(matches)==set(answer)}.")
    

    输出:

    Matches found in 'ffumlmqwfcsyqpss': ['ff', 'ss']. Is the answer expected? True.
    Matches found in 'zztdcqzqddaazdjp': ['zz', 'dd', 'aa']. Is the answer expected? True.
    Matches found in 'urrvucyrzzzooxhx': ['rr', 'oo']. Is the answer expected? True.
    Matches found in 'zettygjpcoedwyio': ['tt']. Is the answer expected? True.
    No match found in 'dtfkgggvqadhqbwb'. Is the answer expected? True.
    No match found in 'rwgwbwzebsnjmtln'. Is the answer expected? True.
    

    薛彭薄
    2023-03-14

    您可以使用以下正则表达式模式:

    ^(?![a-z]*([a-z])\1{2,})[a-z]*([a-z])\2[a-z]*$
    

    此模式表示要匹配:

    ^                        start of the string
    (?![a-z]*([a-z])\1{2,})  same letter does not occur 3 times or more
    [a-z]*                   zero or more letters
    ([a-z])                  capture a letter
    \2                       which is followed by the same letter
    [a-z]*                   zero or more letters
    $                        end of the string
    
     类似资料:
    • 我需要使用通配符类型搜索筛选一组字符串,如下所示: 寻找应该匹配你好,但不是Helo 查找应该匹配"pant"和"想要"但不匹配"ant" 寻找应该匹配"吉普赛人"和"典型" 代表一个或多个字符。我不介意手写或基于正则表达式的搜索。有什么想法吗?典型的。NET方法的通配符匹配0或更多,但我需要1个或更多字符。我该怎么做?

    • 我有一些xml文件,希望删除除特定字符串以外的所有内容。 StackOverflow上还有很多类似的问题,但都不适用于我的文件,在尝试了几个小时不同的正则表达式后,我想寻求帮助。 到目前为止,部分成功但并非完全成功的最接近的正则表达式是: xml文件的示例: 我使用regex101,因此可以将示例粘贴在那里,以了解为什么rex只能部分工作。简而言之,它与第一次出现的不匹配,但与第二次出现的匹配。我

    • 问题内容: 我在用Python将字符串中的数字匹配时遇到麻烦。尽管应该明确匹配,但甚至不匹配 或仅匹配。我的监督在哪里? 问题答案: 阅读文档:http : //docs.python.org/2/library/re.html#re.match 如果在零个或多个字符 开头 的 字符串 您要使用(或)

    • 我正在努力提高我的正则表达式技能。我做不了这个练习。 https://alf.nu/RegexGolf 您必须匹配没有连续相同字符的单词。为了清楚起见,我们应该避免像abba、baab、czzc这样的模式。 我看到的唯一方法是使用捕获组: 然后进行负面展望: 但在网站上,它不工作,因为它不匹配任何东西。 有什么建议吗?谢谢

    • 问题内容: 我在尝试将我的javascript regex经验转移到Python时遇到了麻烦。 我只是想让它工作: …但是它打印无。如果我做: 它匹配…默认情况下是否匹配字符串的开头?当匹配时,如何使用结果? 我如何进行第一场比赛?是否有比python网站提供的文档更好的文档? 问题答案: 隐式添加到您的正则表达式的开头。换句话说,它仅在字符串的开头匹配。 将在所有位置重试。 一般来说,建议您在需

    • 我有这个字符串和这些regexp: 我希望第一个正则表达式失败,而第二个应该匹配。尝试一下,我看到两者都匹配,但我不明白为什么。 这是第一个正则表达式:https://regex101.com/r/hBZK2h/1 这是第二个:https://regex101.com/r/TEZmP6/1 我必须创建一个正则表达式,该表达式与边界为HC-HMC的字符串背面完全匹配,但不能与字符串匹配。有什么提示吗