首页 文章

找到一个由三个大写字母组成的小写字母

提问于
浏览
1

我有一个混合了大写和小写字母的字符串 . 我需要找到每个由3个大写字母包围的小写字母,并从字符串中提取它 .

例如 ZZZaZZZ 我想在前一个字符串中提取 a .

我编写了一个脚本,能够提取 ZZZaZZZ 但不能单独提取 a . 我知道我需要使用嵌套的正则表达式来执行此操作,但我不能完全理解如何实现它 . 以下是我所拥有的:

import string, re                                                                                                                                                                

if __name__ == "__main__":                                                                                                                                                       

    #open the file                                                                                                                                                               
    eqfile = open("string.txt")                                                                                                                                                
    gibberish = eqfile.read()                                                                                                                                                    
    eqfile.close()                                                                                                                                                               

    r = re.compile("[A-Z]{3}[a-z][A-Z]{3}")                                                                                                                                      
    print r.findall(gibberish)

EDIT: 谢谢你们的答案!我想我应该更具体一点 . 我需要找到由三个完全相同的大写字母包围的小写字母,例如在我的示例中 ZZZaZZZ .

3 回答

  • 5

    您需要使用括号捕获您感兴趣的字符串部分,然后使用 re.MatchObject#group 访问它:

    r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")                                                                                                                                      
    m = r.match(gibberish)
    if m:
       print "Match! Middle letter was " + m.group(1)           
    else:
       print "No match."
    
  • 4
    r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})")
    

    (?<=...) 表示积极的外观, (?=...) 是一个积极的前瞻 .

    module re

    (?= ...)匹配if ...匹配next,但不消耗任何字符串 . 这称为先行断言 . 例如,Isaac(?= Asimov)只有在跟随'Asimov'后才会匹配'Isaac' . (?<= ...)匹配,如果字符串中的当前位置前面有匹配的...,它在当前位置结束 .

  • 3

    你真是太近了!阅读MatchObjects.group *方法 . 例如,如果您的脚本以 . 结尾

    r = re.compile("[A-Z]{3}([a-z])[A-Z]{3}")
    print r.match(gibberish).group(1)
    

    然后你将在第一组内捕获所需的角色 .

    要解决匹配重复字母的新约束,可以使用反向引用:

    r = re.compile(r'([A-Z])\1{2}(?P<middle>[a-z])\1{3}')
    m = r.match(gibberish)
    if m is not None:
        print m.group('middle')
    

    这就是:

    • 匹配字母A-Z并记住它 .

    • 匹配找到的第一个字母的两次出现 .

    • 匹配您的小写字母并将其存储在名为 middle 的组中 .

    • 匹配找到的第一个字母的三个连续实例 .

    • 如果找到匹配项,则打印 middle 组的值 .

相关问题