2015-08-12 2 views
1

По существу у меня есть текстовый документ с этим в нем,Использование регулярных выражений для извлечения строки из текстового файла

The sound of a horse at a gallop came fast and furiously up the hill. 
"So-ho!" the guard sang out, as loud as he could roar. 
"Yo there! Stand! I shall fire!" 
The pace was suddenly checked, and, with much splashing and floundering, a man's voice called from the mist, "Is that the Dover mail?" 
"Never you mind what it is!" the guard retorted. "What are you?" 
"_Is_ that the Dover mail?" 
"Why do you want to know?" 
"I want a passenger, if it is." 
"What passenger?" 
"Mr. Jarvis Lorry." 
Our booked passenger showed in a moment that it was his name. 
The guard, the coachman, and the two other passengers eyed him distrustfully. 

Использование регулярных выражений, мне нужно, чтобы напечатать все, что в двойных кавычках, я не хочу полный код я просто нужно знать, как я должен это делать, какое регулярное выражение было бы наиболее полезным. Советы и указатели, пожалуйста!

+1

Я бы пошел с этим красивым [tutorial] (https://docs.python.org/3.4/howto/regex.html). – Sait

+0

Так что я не должен публиковать ответ, который делает то, что вы хотите? Это меньше того, о чем идет речь :). – Cyphase

ответ

2

r'(".*?")' будет соответствовать каждой строке в двойных кавычках. В скобках указывается захваченная группа, . соответствует каждому символу (кроме новой строки), * указывает повторение, а ? делает его неживым (прекращает сопоставление прямо перед следующей двойной кавычкой). Если вы хотите, включите опцию re.DOTALL, чтобы сделать . также соответствующими символам новой строки.

+1

В частности, '*' указывает любое число (ноль или более) непосредственно предшествующего шаблона - в этом случае '.', что является любым символом. –

+0

Я столкнулся с проблемой, когда на линии с несколькими «" она печатает это на той же строке, что и предыдущая, в то время как мне нужно поместить ее на новую строку, есть ли все равно сделать это после того, как она найдет вторую " он делает новую строку? –

+0

@NickAdams - Вместо 'print (''. join (string))', do 'print (* strings, sep = '\ n')'. – TigerhawkT3

0

Это должно сделать это (объяснение ниже):

from __future__ import print_function 

import re 

txt = """The sound of a horse at a gallop came fast and furiously up the hill. 
"So-ho!" the guard sang out, as loud as he could roar. 
"Yo there! Stand! I shall fire!" 
The pace was suddenly checked, and, with much splashing and floundering, 
a man's voice called from the mist, "Is that the Dover mail?" 
"Never you mind what it is!" the guard retorted. "What are you?" 
"_Is_ that the Dover mail?" 
"Why do you want to know?" 
"I want a passenger, if it is." 
"What passenger?" 
"Mr. Jarvis Lorry." 
Our booked passenger showed in a moment that it was his name. 
The guard, the coachman, and the two other passengers eyed him distrustfully. 
""" 

strings = re.findall(r'"(.*?)"', txt) 

for s in strings: 
    print(s) 

Результат:

So-ho! 
Yo there! Stand! I shall fire! 
Is that the Dover mail? 
Never you mind what it is! 
What are you? 
_Is_ that the Dover mail? 
Why do you want to know? 
I want a passenger, if it is. 
What passenger? 
Mr. Jarvis Lorry. 

r'"(.*?)"' будет соответствовать каждой строки в двойных кавычках. Скобки указывают группу захвата, поэтому вы получите текст без двойных кавычек. . соответствует каждому символу (кроме новой строки), а * означает «ноль или более последнего», последнее, что является .. ? после * делает * «не жадным», что означает, что он соответствует как можно меньше. Если вы не использовали ?, вы получили бы только один результат; строка, содержащая все между первой и последней двойной кавычками.

Вы можете включить флаг re.DOTALL, чтобы . также соответствовал символам новой строки, если вы хотите извлечь строки, пересекающие линии. Если вы хотите это сделать, используйте re.findall(r'"(.*?)"', txt, re.DOTALL). Новая строка будет содержать, поэтому вам нужно будет это проверить.

Объяснение неизбежно похоже на/на основе ответа @ TigerhawkT3. Голосуйте за ответ!

+0

Это не дает никаких объяснений .. – TigerhawkT3

+0

Если вы видите, что ваш ответ идентичен предыдущему, обычно предпочтительнее просто удалять дубликат, а не копировать старый ответ в свой собственный. Это помогает сократить «шум» для посетителей. – TigerhawkT3

+0

@ TigerhawkT3, понятный, но это не просто дубликат. У меня уже был код и вывод там, и я хотел добавить объяснение, но я не хотел обфускации его _just_ так, чтобы он сильно отличался от вашего :). Должен ли я просто уйти мой ответ без объяснения, и чтобы зрители могли прочитать оба ответа, так что не было перекрытия? Очевидно, что в ответах на один и тот же вопрос часто возникает некоторое совпадение. Я объяснил немного больше, чем вы; но опять же, любые хорошие объяснения будут похожими.И я вообще включил упоминание вашего ответа :). – Cyphase

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