同时从字符串中提取和替换字母

时间:2015-01-04 21:11:09

标签: python string replace extract

我有一个'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))]

1 个答案:

答案 0 :(得分:0)

在你的代码中,有很多错误:

  1. 正则表达式是贪婪的。因此,finditer找到了第一个This和最后一个位置。
  2. 代码的第二部分不在第一个循环中,因此只处理了最后一个finditer.
  3. 正则表达式不是非常容错的
  4. 找到这个:

    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)