在python字符串替换中使用星号(*)作为小丑?

在python字符串替换中使用星号(*)作为小丑?,python,regex,string,replace,Python,Regex,String,Replace,我是python的初学者,目前正在努力解决一些问题: 我想在一个字符串中做一些更改。 可以用一个星号(*)代替几个字符吗? 例如,我有一个字符串: string1 = "The new year is about to become an old year" 我想用这个模式来寻找: find: *year*year* replace it with: *century*one* 这将导致: string1 = "The new century is about

我是python的初学者,目前正在努力解决一些问题:

我想在一个字符串中做一些更改。 可以用一个星号(*)代替几个字符吗? 例如,我有一个字符串:

string1 = "The new year is about to become an old year"
我想用这个模式来寻找:

find:
*year*year*

replace it with:
*century*one*
这将导致:

string1 = "The new century is about to become an old one"
意思是“*”字符将替换“年”和“年”单词之间和之前的所有字符。
这可能吗?

这是一个不进行任何错误检查的示例实现

>>> def custom_replace(s, find_s, replace_s):
...     terms = find_s.split('*')[1:-1]
...     replacements = replace_s.split('*')[1:-1]
...     for term, replacement in zip(terms, replacements):
...       s = s.replace(term, replacement, 1)
...     return s
... 
>>> string1 = "The new year is about to become an old year"
>>> print custom_replace(string1, "*year*year*", "*century*one*")
The new century is about to become an old one
>>> 

你不需要星号。只用

import re
string1 = "The new year is about to become an old year"
new_string = re.sub(r"(?P<y>year)(.*)(?P=y)", r"century\2one", string1)
一次通过,使用正则表达式。说明:第一个参数的每个括号定义一个捕获组。第一个名称为“y”(带有
?P
),与字面上的
年份相匹配;第二个匹配任何字符(
)的任何数字(
*
);第三个匹配第一个组定义的命名组“y”(在本例中为“年”)。第二个论点用世纪替换第一组,用世纪替换第三组。注意,在Python中,我们从零开始计数

感谢@JonhY在下面的评论中给出的提示,还有。我的英雄们

在我看来,您似乎还没有听说过正则表达式(或正则表达式)。正则表达式是一种非常强大的迷你语言,用于匹配文本。Python有一个非常好的正则表达式实现。看看:

输出:

The new century is about to become an old one

这件事值得你去调查一下。在您的例子中,您需要知道的主要事情是,
匹配任何单个字符,
*
匹配任何字符的零个或多个,括号用于分组,反斜杠后跟数字构成(现有组的)反引用

因此,要匹配
year
,后跟任意内容,再后跟
year
,请使用
year.*year

现在,要替换,请使用分组和反向引用:

import re
string2 = re.sub('year(.*)year', r'century\1one', string1)
对于大多数初学者来说,正则表达式的有效使用肯定不是显而易见的。有关更温和介绍的一些建议,请参见以下问题:


您正在寻找正则表达式。伙计,现在可能是您选择答案的时候了;7) 谢谢你的回复。但这并不完全符合我的预期。您的代码返回了这样一条消息:“新世纪即将成为旧世纪”,而我正在寻找这样一条消息:“新世纪即将成为旧世纪”。您的“解决方案”与OP所要求的不同,并且没有帮助。它甚至没有说明正则表达式功能的有用性。如果OP想要做的只是将
year
替换为
century
,他们只需执行
string1.替换('year','century')
@JohnY Noted and fixed;7) +1但我不认为命名的捕获值得为这样一个简单的案例而费心。这似乎更容易理解:
r'(年份)(.*)\1'
@FMc+1,没错。这只是我对一项全新的技能感到兴奋。:)此外,这可能有些过分,但我发现对于新学员来说,确保每个小组都在括号内并没有那么直观。并显示您可以为组提供任意名称。感谢您的回复。但是,当从“查找”和“替换”模式的开头删除*时,此解决方案不起作用。例如:string1=“year is Will to a old year”打印自定义替换(string1,“year year”,“centuryone”)将导致“one is Will to a old year”,这是不正确的。您的示例末尾有星号。如果要在没有它们的情况下进行匹配,请删除第2行和第3行中的
[1:-1]
。谢谢John。Python文档对于初学者来说是非常糟糕的材料。你的代码工作得很好。但是,如果我更改
find
replace
:string1=“四天后新年就要过去了”find=“yearyear*4*”replace=“centuryone*10”我需要以什么方式修改您的代码才能使这个新案例生效?我认为Python文档作为一个整体至少和大多数文档一样对初学者友好。特别是本教程远远高于平均水平,当然,与编程新手相比,本教程更适合其他语言的程序员。您面临的问题是正则表达式特别(而且本质上)面向有经验的程序员@dmvianna已经包含了一些链接供进一步阅读;我会在我的答案中添加更多内容。我更喜欢@JohnY的答案,但要在数字反向引用后添加数字文字,需要将其视为任意的(如我的第一个答案)。因此,您的代码将是
re.sub('year(.*)year(.*)year(.*)4',r'century\1one\g10',string1)
。看,谢谢。“\g”代表什么?正确。通过
string=“再过4天或某个时候,新年就要过去了。”
你将通过学习教程获得知识,只有当你被困在谷歌上找不到答案时才会来到这里。而且,它真的帮助我关注推特。
The new century is about to become an old one
import re
string2 = re.sub('year(.*)year', r'century\1one', string1)