69

我在 Python 中有一个字符串,比如说The quick @red fox jumps over the @lame brown dog.

我试图用@一个以单词作为参数的函数的输出替换每个开头的单词。

def my_replace(match):
    return match + str(match.index('e'))

#Psuedo-code

string = "The quick @red fox jumps over the @lame brown dog."
string.replace('@%match', my_replace(match))

# Result
"The quick @red2 fox jumps over the @lame4 brown dog."

有没有聪明的方法来做到这一点?

4

4 回答 4

120

您可以将函数传递给re.sub. 该函数将接收一个匹配对象作为参数,用于.group()将匹配提取为字符串。

>>> def my_replace(match):
...     match = match.group()
...     return match + str(match.index('e'))
...
>>> string = "The quick @red fox jumps over the @lame brown dog."
>>> re.sub(r'@\w+', my_replace, string)
'The quick @red2 fox jumps over the @lame4 brown dog.'
于 2012-09-26T08:36:33.720 回答
9

我不知道你可以将一个函数传递给一个re.sub()。根据@Janne Karila 的回答来解决我遇到的问题,该方法也适用于多个捕获组。

import re

def my_replace(match):
    match1 = match.group(1)
    match2 = match.group(2)
    match2 = match2.replace('@', '')
    return u"{0:0.{1}f}".format(float(match1), int(match2))

string = 'The first number is 14.2@1, and the second number is 50.6@4.'
result = re.sub(r'([0-9]+.[0-9]+)(@[0-9]+)', my_replace, string)

print(result)

输出:

The first number is 14.2, and the second number is 50.6000.

这个简单的示例要求所有捕获组都存在(没有可选组)。

于 2017-05-31T21:00:47.480 回答
5

尝试:

import re

match = re.compile(r"@\w+")
items = re.findall(match, string)
for item in items:
    string = string.replace(item, my_replace(item)

这将允许您用函数的输出替换以 @ 开头的任何内容。我不太清楚您是否也需要有关该功能的帮助。让我知道是否是这种情况

于 2012-09-26T08:31:47.777 回答
2

一个简短的正则表达式和减少:

>>> import re
>>> pat = r'@\w+'
>>> reduce(lambda s, m: s.replace(m, m + str(m.index('e'))), re.findall(pat, string), string)
'The quick @red2 fox jumps over the @lame4 brown dog.'
于 2012-09-26T08:43:12.087 回答