Найдите строчную букву, окруженную тремя заглавными буквами

1

У меня есть строка с комбинацией прописных и строчных букв. Мне нужно найти каждую строчную букву, которая обрабатывается тремя заглавными буквами и извлекает ее из строки.

Например 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.

Теги:
string

3 ответа

5
Лучший ответ

Вы так близко! Читайте о .group * методов MatchObjects. Например, если ваш скрипт закончился

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. Сопоставьте букву AZ и запомните ее.
  2. Сопоставьте два вхождения первой найденной буквы.
  3. Сопоставьте строчную букву и сохраните ее в группе с именем middle.
  4. Сопоставьте еще три последовательных экземпляра первой найденной буквы.
  5. Если совпадение найдено, напечатайте значение middle группы.
  • 0
    Это не будет соответствовать обеим строчным буквам в "AAAbAAAbAAA" .
  • 0
    Твой мужчина, это именно то, что я искал.
4
r = re.compile("(?<=[A-Z]{3})[a-z](?=[A-Z]{3})") 

(?<=...) указывает на положительный lookbehind и (?=...) является положительным взглядом.

модуль re

(?=...)

Соответствует, если... соответствует следующей, но не использует ни одну из строк. Это называется ожидаемым утверждением. Например, Isaac (?=Asimov) будет соответствовать 'Isaac ' только если его последует 'Asimov'.

(?<=...)

Соответствует, если текущей позиции в строке предшествует совпадение для..., которое заканчивается в текущей позиции.

  • 0
    +1, но я не думаю, что вам нужен как взгляд вперед, так и взгляд назад. Либо один сам по себе должен работать с другим, будучи нормальным соответствием
  • 0
    @gnibbler, правда, но таким образом, если вы делаете findall или finditer вы просто возвращаете список без необходимости понимания.
Показать ещё 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."
  • 0
    Это не будет соответствовать обеим строчным буквам в "AAAbAAAbAAA" .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню