2015-11-23 3 views
0

Итак, я искал способы «захватить» определенную часть текстового файла с Python, , когда вы знаете только, что было до и после этого конкретного текста. Я хочу что-то вроде this, но для одиночных строк. Например, если у меня есть текстовый файл с именем test.txt, который выглядит как:Python читает определенный текст из одной строки

This 
is 
my 
test 
file 

Тогда я могу использовать

with open('test.txt') as input_data: 
    for line in input_data: 
     if line.strip() == 'is': 
      break 
    for line in input_data: 
     if line.strip() == 'test': 
      break 
     print(line) 

... и что работает отлично подходит для захвата my, но если мой текстовый файл является одна линия, например:

This is my test file 

Тогда это не сработает. Я не хочу захватывать my строковым индексом, потому что я хочу что-то, что будет работать только на основе знания того, что происходит до и после этой части строки. Я пробовал смотреть на множество вопросов, но ничего не нашел.

Спасибо!

ответ

2

Вы можете получить, что с регулярным выражением:

with open('test.txt') as input_data: 
    for line in input_data: 
     match = re.search(r' is (.*) test ', line) 
     if match: 
      print(line) 
      print(match.group(1)) 

3-я строка выглядит для модели с «является тест», если он будет найден, он будет печатать первую всю строку, а затем только строки то есть между «есть» и «мой». Я не был уверен, какой из них вы предпочтете.

Редактировать: изменил регулярное выражение, чтобы включить пробел перед «есть», иначе «Это» также было бы сопоставлено. Удалены опережения и просмотра назад, так как нет необходимости

+2

Я думаю, что OP ищет все, что между двумя строками, например 'is' и' test'. «Мой» - это то, что может измениться. – TigerhawkT3

+0

Благодарим вас за очищение, что вверх @ TigerhawkT3. Я отредактирую вопрос, чтобы указать, что –

+1

Правда, я исправил его. – Alexander

0

Давайте рассмотрим этот тестовый файл:

$ cat testfile 
This                                                
is                                                
my                                                
test                                                
file                                                
this is your test file 

Чтобы получить оба матча:

>>> import re 
>>> re.findall(r'\bis\s+(.*?)\s+test\b', open('testfile').read()) 
['my', 'your'] 

Если мы хотим быть более осторожными о том, чтобы убедиться, что файл закрыты, мы должны использовать with:

>>> with open('testfile') as f: 
...  re.findall(r'\bis\s+(.*?)\s+test\b', f.read()) 
... 
['my', 'your'] 
1
start = ' is ' 
end = ' test ' 
with open('test.txt') as input_data: 
    for line in input_data: 
     try: 
      start_index = line.index(start) + len(start) 
      end_index = line.index(end) 
      print line[start_index:end_index] 
     except ValueError: 
      print "not find in this line[%s]" % line.rstrip() 

вы можете использовать index, чтобы узнать начальное слово и конечное слово, а затем получить подстроку

1

Похоже, что вы хотите, чтобы захватить некоторую информацию между «есть» и «тест», то регулярное выражение может помочь вы, например:

with open('test.txt') as input_data: 
    match = re.findall(r'\sis\s*(\w[\s\S]+?)\s*test', input_data.read()) 
     for item in match: 
      print item 
Смежные вопросы