在python字符串替换中使用asterix字符(*)作为joker?

时间:2013-12-26 21:01:58

标签: 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 to become an old one"

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

4 个答案:

答案 0 :(得分:4)

你不需要星号。只需使用

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)

一次通过,使用正则表达式。说明:第一个参数的每个括号定义一个捕获组。第一个被命名为&#34; y&#34; (使用?P)并与文字year匹配;第二个匹配任何字符(*)的任意数字(.);第三个匹配命名组&#34; y&#34;由第一组定义(在我们的例子中,&#34;年&#34;)。第二个参数用世纪替换第一个匹配的组,用一个替换第三个组。请注意,在Python中,我们从开始计数。

感谢 @JonhY 获取以下评论中的指针,以及m.buettner。我的英雄!

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

Tutorial at Regex One

Python Documentation on Regex

答案 1 :(得分:2)

值得您关注regular expressions。在您的情况下,您需要知道的主要事项是.匹配任何单个字符,.*匹配任何字符的零个或多个,括号用于分组,反斜杠后跟数字形式反向引用(现有组)。

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

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

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

对大多数初学者来说,有效使用正则表达式绝对不是很明显。有关gentler介绍的一些建议,请参阅此问题:

https://stackoverflow.com/questions/2717856/any-good-and-gentle-python-regexp-tutorials-out-there

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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