2015-01-04 2 views
0

У меня есть строка 'string1' с двумя видами позиций: обратное положение (обозначенное позицией = изменение) и прямая позиция (обозначенная только позицией =). Чтобы убедиться, возьмите, например, буквы = abcdef и position = change (1-4). Буквы между первым и четвертым пробелами, которые являются bcd, должны быть извлечены, а буква c должна быть заменена номером 1. По причинам, не относящимся к делу, в случае с обратной позицией всегда есть буква c, должен быть заменен цифрой 1. В случае прямого положения замена не выполняется.Извлеките и замените буквы из строки одновременно.

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

string1='*This is an inverse position [position=change(1-4)]in a long sentence\n*This is a direct position [position=2-7] in a long sentence' 
import re 
a=re.finditer(r'(\*This).*\]', string1) 
for element in a: 
    print element.group() 

letters='abcdefghijklmno' 
b=re.finditer(r'([0-9]+)-([0-9]+)', element.group()) 
for i in b: 
    if element.group().find('change'): 
     changedletters=letters[int(i.group(1)) : int(i.group(2))].replace('c', '1') 
     print element.group()+changedletters 
    else: 
     print letters[int(i.group(1)) : int(i.group(2))] 
+0

Что не работает? Имеются ли сообщения об ошибках? Каков ожидаемый и реальный результат? – Daniel

+0

@ Даниэль, когда я запускаю этот код (и добавляет() брекеты при использовании печати), выход: '* Это обратная позиция [position = change (1-4)] * Это прямая позиция [position = 2-7] * Это прямая позиция [позиция = 2-7] 1defg' – implicati0n

+0

@ Даниэль Результат (>>> означает новую строку, извините, я не знаю, как написать новую строку): > >> * Это обратная позиция [position = change (1-4)] >>> * Это прямая позиция [позиция = 2-7] >>> * Это прямая позиция [позиция = 2- 7] 1defg И ожидаемое: >>> * Это обратное положение [position = change (1-4)] b1d >>> * Это прямая позиция [позиция = 2-7] cdefg Она читает только последнее утверждение, а не весь цикл (не читает случай обратной позиции), а также заменяет букву c номером 1 в прямом положении (когда он этого не должен делать). Сообщения об ошибках отсутствуют. – Dang

ответ

0

В вашем коде, есть так много плохого:

  1. регулярные выражения являются жадными. Таким образом, ваш finditer находит первые This и последнюю позицию.
  2. Ваша вторая часть кода находится не внутри первого цикла, поэтому обрабатывается только последнее нахождение finditer.
  3. Регулярное выражение не очень отказоустойчивой

Найти это:

import re 

LETTERS = 'abcdefghijklmno' 

def output_letters(text): 
    elements = re.finditer(r'(\*This).*?\[position=(change\()?(\d+)-(\d+)\)?\]', text) 
    for element in elements: 
     print element.group(0) 
     letters = LETTERS[int(element.group(3)):int(element.group(4))] 
     if element.group(2): 
      letters = letters.replace('c','1') 
     print letters 


string1='*This is an inverse position [position=change(1-4)]in a long sentence\n*This is a direct position [position=2-7] in a long sentence' 
output_letters(string1) 
Смежные вопросы