同时从字符串中提取和替换字母
Extract and replace letters from a string both at the same time
我有一个包含两种位置的“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))]
在你的代码中,有很多错误:
- 正则表达式是贪婪的。所以你的
finditer
找到第一个 This
和最后一个位置。
- 您的代码的第二部分不在第一个循环内,因此仅处理最后一次出现的 finditer。
- 正则表达式的容错性不是很好
找到这个:
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)
我有一个包含两种位置的“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))]
在你的代码中,有很多错误:
- 正则表达式是贪婪的。所以你的
finditer
找到第一个This
和最后一个位置。 - 您的代码的第二部分不在第一个循环内,因此仅处理最后一次出现的 finditer。
- 正则表达式的容错性不是很好
找到这个:
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)