2015-01-04 96 views
0

我有一個帶有兩種位置的'string1':反向位置(由position = change標識)和直接位置(由position =標識)。爲了使自己清楚,例如letters = 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

@Daniel當我運行這個代碼(並且在使用print時添加()括號)時,輸出是:'*這是一個反向位置[position = change(1-4)] *這是一個直接位置[position = 2-7] *這是一個直接的位置[position = 2-7] 1defg' – implicati0n

+0

@Daniel結果(>>>表示新的一行,對不起,我不知道如何寫一個新行): > >> *這是一個反向位置[position = change(1-4)] >>> *這是一個直接位置[position = 2-7] >>> *這是一個直接位置[position = 2- 7] 1defg 和預期: >>> *這是一個反向位置[position = change(1-4)] b1d >>> *這是一個直接位置[position = 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) 
相關問題