2014-02-14 5 views
1

Я довольно новичок в python и программировании в целом. Просто изучать мои ABC. Скажем, у меня есть такая строка.Разбиение строки, когда встречается определенное слово

s = "DEALER:'S up, Bubbless? BUBBLES: Hey. DEALER: Well, there you go. JUNKIE: Well, what you got?DEALER: I got some starters."; 

Я хочу, чтобы строка заканчивалась, когда встречалось слово с верхним регистром и двоеточие (:) в конце. И затем создается новая строка, в которой хранится другая строка. Для приведенных выше строк, я буду получать

s1 = "DEALER:'S up, Bubbless?" 
    s2 = "BUBBLES: Hey." 
    s3 = "DEALER: Well, there you go." 

Это мои регулярное выражение код делают это

mystring = """ 
DEALER: 'S up, Bubbless? 
BUBBLES: Hey. 
DEALER: Well, there you go. 
JUNKIE: Well, what you got? 
DEALER: I got some starters. """ 

#[A-Z]+:.*?(?=[A-Z]+:|$) 

#p = re.compile('([A-Z]*):') 
p = re.compile('[A-Z]+:.*?(?=[A-Z]+:|$)') 
s = set(p.findall(mystring)) 

Как бы я цикл через него, чтобы получить каждую строку? Он получает только первую строку (например, DEALER: «S вверх, Bubbless?») И останавливается. Извините, если я немного пошутил. Новое в программировании. Обучение с практикой, как я иду по

ответ

1

Поскольку это многострочные строки, вам нужно использовать re.DOTALL вариант, как этот

p = re.compile('[A-Z]+:.*?(?=[A-Z]+:|$)', re.DOTALL) 

Выход

set(["DEALER: 'S up, Bubbless?\n", 
    'JUNKIE: Well, what you got?\n', 
    'DEALER: Well, there you go.\n', 
    'DEALER: I got some starters. ', 
    'BUBBLES: Hey.\n']) 

Цитирования из re.DOTALL docs,

Сделайте «.» специальный символ соответствует любому персонажу вообще, включая строку ; без этого флага ". будет соответствовать чему угодно, кроме новой строки.

Таким образом, без этой опции .*? не соответствует \n. Вот почему ни одна из них не совпадала с другими строками.

+0

спасибо soo много! Идеально. – user3078335

Смежные вопросы