regex 使用星号字符(*)作为python字符串替换中的joker?

uz75evzq  于 2023-08-08  发布在  Python
关注(0)|答案(4)|浏览(104)

我是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"


表示“*”字符将替换“年”和“年”之间和之前的所有字符。这可能吗?

hs1ihplo

hs1ihplo1#

这将是值得你去看看regular expressions。在你的例子中,你需要知道的主要事情是.匹配任何单个字符,.*匹配零个或多个任何字符,括号用于分组,反斜杠后跟一个数字形成一个(现有组的)* 反向引用 *。
因此,要匹配year,然后是任意内容,然后再匹配year,请使用year.*year
现在,使用分组和反向引用来替换:

import re
string2 = re.sub('year(.*)year', r'century\1one', string1)

字符串
对于大多数初学者来说,正则表达式的有效使用肯定不是显而易见的。有关更温和的介绍的一些建议,请参阅此问题:
https://stackoverflow.com/questions/2717856/any-good-and-gentle-python-regexp-tutorials-out-there
上面的问题已被删除,而且那里的许多链接已经死了。其中有一些在撰写本文时仍然有效:

当然,Googling应该会有很多资源。

jbose2ul

jbose2ul2#

你不需要星号。就用

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)

字符串
或者更简洁地说:

new_string = re.sub(r"(year)(.*)\1", r"century\2one", string1)


一遍,使用正则表达式。说明:第一个参数的每个括号定义一个捕获组。第一个命名为“y”(带有?P),匹配文字year;第二个匹配任意数字(*)的任意字符(.);第三个匹配由第一个组定义的命名组“y”(在我们的例子中是“year”)。第二个参数用 * 世纪 * 替换第一个匹配组,用 one 替换第三个匹配组。注意,在Python中,我们从0开始计数。
感谢**@JonhY在下面的评论中的指针,还有m.buettner。我的英雄们!
在我看来,你似乎还没有听说过
正则表达式**(或 regex)。Regex是一种非常强大的小型语言,用于匹配文本。Python有一个非常好的正则表达式实现。看一看:
Tutorial at Regex One
Python Documentation on Regex

uwopmtnx

uwopmtnx3#

string1 = "The new year is about to become an old year"
find = '*year*year*'
replace = '*century*one*'

for  f,r in zip(find.strip('*').split('*'), replace.strip('*').split('*')):
    string1 = string1.replace(f, r, 1)

字符串
输出量:

The new century is about to become an old one

ds97pgxw

ds97pgxw4#

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

>>> 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
>>>

字符串

相关问题