Python 在某些条件下替换子字符串

Python 在某些条件下替换子字符串,python,Python,以下是我所拥有的: stem_text = "x^3+21x^2+1x+6" 我想把它改成: stem_text = "x^3+21x^2+x+6" 我的代码是这样的: indices = [m.start() for m in re.finditer("1x", stem_text)] for i in indices: if stem_text[i-1] not in ["0","1","2","3","4","5","6","7","8","9"]: stem_

以下是我所拥有的:

stem_text = "x^3+21x^2+1x+6"
我想把它改成:

stem_text = "x^3+21x^2+x+6"
我的代码是这样的:

indices = [m.start() for m in re.finditer("1x", stem_text)]
for i in indices:
    if stem_text[i-1] not in ["0","1","2","3","4","5","6","7","8","9"]:
        stem_text = stem_text.replace(stem_text[i:i+2],"x")`
但是,它仍然在替换两个出现的“1x”

我用这两篇文章让我达到了我认为我应该做的工作的程度,但事实并非如此:


将\b添加到模式
1x
中,以精确匹配单词1x,而不是匹配
21x
或其他包含
1x

import re
stem_text = "x^3+21x^2+1x+6"

print(re.sub(r'\b1x\b', r'x', stem_text))
结果是

x^3+21x^2+x+6

阅读python regex

将\b添加到模式
1x
中,以精确匹配单词1x,而不是匹配
21x
或其他包含
1x

import re
stem_text = "x^3+21x^2+1x+6"

print(re.sub(r'\b1x\b', r'x', stem_text))
结果是

x^3+21x^2+x+6

阅读python regex

假设您希望用
x
替换所有确切出现的
1x
,您可以使用
re.sub

import re

stem_text = "x^3+21x^2+1x+6"

re.sub(r'\b1x\b', 'x', stem_text)

\b
这里的意思是

假设您希望用
x
替换所有确切出现的
1x
,您可以使用
re.sub

import re

stem_text = "x^3+21x^2+1x+6"

re.sub(r'\b1x\b', 'x', stem_text)

\b
这里的意思是

如果您只想替换“1x”,请使用以下示例:

stem_text = "x^3+21x^2+1x+6"
indices = [x for x in stem_text.split("+")]
for i in indices:
    if len(i) == 2 and i == "1x": stem_text = stem_text.replace(i + "+", "x+")

print stem_text
stem_text = "x^3+21x^2+1x+6+2x+4x+0x"
indices = [x for x in stem_text.split("+")]
Int = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
for x in indices:
    for i in Int:
        if x == i + "x": stem_text = stem_text.replace(i + "x", "x")

print stem_text
输出:
x^3+21x^2+x+6

否则,如果要替换“x”之前的任何数字,请使用以下示例:

stem_text = "x^3+21x^2+1x+6"
indices = [x for x in stem_text.split("+")]
for i in indices:
    if len(i) == 2 and i == "1x": stem_text = stem_text.replace(i + "+", "x+")

print stem_text
stem_text = "x^3+21x^2+1x+6+2x+4x+0x"
indices = [x for x in stem_text.split("+")]
Int = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
for x in indices:
    for i in Int:
        if x == i + "x": stem_text = stem_text.replace(i + "x", "x")

print stem_text

输出:
x^3+x^2+x+6+x+x+x

如果您只想替换“1x”,请使用以下示例:

stem_text = "x^3+21x^2+1x+6"
indices = [x for x in stem_text.split("+")]
for i in indices:
    if len(i) == 2 and i == "1x": stem_text = stem_text.replace(i + "+", "x+")

print stem_text
stem_text = "x^3+21x^2+1x+6+2x+4x+0x"
indices = [x for x in stem_text.split("+")]
Int = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
for x in indices:
    for i in Int:
        if x == i + "x": stem_text = stem_text.replace(i + "x", "x")

print stem_text
输出:
x^3+21x^2+x+6

否则,如果要替换“x”之前的任何数字,请使用以下示例:

stem_text = "x^3+21x^2+1x+6"
indices = [x for x in stem_text.split("+")]
for i in indices:
    if len(i) == 2 and i == "1x": stem_text = stem_text.replace(i + "+", "x+")

print stem_text
stem_text = "x^3+21x^2+1x+6+2x+4x+0x"
indices = [x for x in stem_text.split("+")]
Int = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
for x in indices:
    for i in Int:
        if x == i + "x": stem_text = stem_text.replace(i + "x", "x")

print stem_text

输出:
x^3+x^2+x+6+x+x+x

如果方程只有加法运算符:

stem_text = "x^3+21x^2+1x+6"

new_string = stem_text.replace('+1x','+x')
print(new_string)
输出:

x^3+21x^2+x+6
x+x-x/x*x+10x
如果方程有多个运算符:

stem_text = '1x+1x-1x/1x*1x+10x'
op_list = ['','+','-','*','/']
#list of operations in equation
for each_op in op_list:
    stem_text = stem_text.replace(each_op+'1x',each_op+'x') #'each_op + 1x' is used to prevent replacing nos. like 21x,31x etc


print(stem_text)
输出:

x^3+21x^2+x+6
x+x-x/x*x+10x

注意:如果方程只有加法运算符,则这是低效的解:

stem_text = "x^3+21x^2+1x+6"

new_string = stem_text.replace('+1x','+x')
print(new_string)
输出:

x^3+21x^2+x+6
x+x-x/x*x+10x
如果方程有多个运算符:

stem_text = '1x+1x-1x/1x*1x+10x'
op_list = ['','+','-','*','/']
#list of operations in equation
for each_op in op_list:
    stem_text = stem_text.replace(each_op+'1x',each_op+'x') #'each_op + 1x' is used to prevent replacing nos. like 21x,31x etc


print(stem_text)
输出:

x^3+21x^2+x+6
x+x-x/x*x+10x

注意:这是一种低效的解决方案

大多数答案在完成工作之前都是无效的。这是一个解决方案,在这个问题的另一个答案中得到启发,但是,它可以用于字符串中的任何字母。如中所述,它被称为反向引用

>>> import re
>>> regex = r'\b1(\w)\b'
>>> print(re.sub(regex, r'\g<1>', 'z^3+4z^2+1z+5'))
z^3+4z^2+z+5
>>> print(re.sub(regex, r'\g<1>', 'y^3+21y^2+1y+6'))
y^3+21y^2+y+6
>>重新导入
>>>regex=r'\b1(\w)\b'
>>>打印(关于sub(regex,r'\g',z^3+4z^2+1z+5'))
z^3+4z^2+z+5
>>>打印(关于sub(regex,r'\g',y^3+21y^2+1y+6'))
y^3+21y^2+y+6

之前的大多数答案都已经完成了。这是一个解决方案,在这个问题的另一个答案中得到启发,但是,它可以用于字符串中的任何字母。如中所述,它被称为反向引用

>>> import re
>>> regex = r'\b1(\w)\b'
>>> print(re.sub(regex, r'\g<1>', 'z^3+4z^2+1z+5'))
z^3+4z^2+z+5
>>> print(re.sub(regex, r'\g<1>', 'y^3+21y^2+1y+6'))
y^3+21y^2+y+6
>>重新导入
>>>regex=r'\b1(\w)\b'
>>>打印(关于sub(regex,r'\g',z^3+4z^2+1z+5'))
z^3+4z^2+z+5
>>>打印(关于sub(regex,r'\g',y^3+21y^2+1y+6'))
y^3+21y^2+y+6

您是否只想替换确切出现的
1x
?您可以尝试将正则表达式更改为“\+1x”而不仅仅是“1x”。在这里,简单的正则表达式非常简单。用$1x替换/(\D)1x/您是否只想替换确切出现的
1x
?您可以尝试将正则表达式更改为“\+1x”,而不仅仅是“1x”。在这里,简单的正则表达式非常简单。用$1x替换/(\D)1x/我们的第一个示例替换了
21x
中的
1x
,我相信这不是OP想要的。将
1x
替换为
x
的想法是因为在数学中,“x”前面的“1”被称为“隐含1”,因此它被简单地写为x。@ILostMySpoon ohh,我很怀念它。谢谢,我编辑了答案。您的第一个示例替换了
21x
中的
1x
,我相信这不是OP想要的。将
1x
替换为
x
的想法是因为在数学中,“x”前面的“1”被称为“隐含1”,因此它被简单地写为x。@ILostMySpoon ohh,我很怀念它。谢谢,我编辑了答案。