找到一个由三个大写字母包围的小写字母

时间:2012-05-03 00:02:00

标签: python regex string

我有一个混合了大写和小写字母的字符串。我需要找到每个由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)           

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

3 个答案:

答案 0 :(得分:5)

所以关闭!阅读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')

其内容如下:

  1. 匹配字母A-Z并记住它。
  2. 匹配找到的第一个字母的两次出现。
  3. 匹配您的小写字母并将其存储在名为middle的组中。
  4. 匹配找到的第一个字母的三个连续实例。
  5. 如果找到匹配项,请打印middle组的值。

答案 1 :(得分:4)

r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})") 

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

module re

  

(?=...)

     

匹配if ...匹配next,但不消耗任何字符串。这称为先行断言。例如,Isaac (?=Asimov)只有在'Isaac '之后才匹配'Asimov'

     

(?<=...)

     

匹配,如果字符串中的当前位置前面有匹配的...,那将在当前位置结束。

答案 2 :(得分:3)

您需要使用括号捕获您感兴趣的字符串部分,然后使用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."