gpt4 book ai didi

python - 为什么我必须将可调用对象传递给 re.sub 以生成大写字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 15:58:54 26 4
gpt4 key购买 nike

下面是一个有点做作的例子,它解决了我最终的问题......

我想使用正则表达式将所有格名词的第一个字符大写。假设我有一个正则表达式(可能很差)匹配所有格名词。即...

### Regex explanation ###
# 1. match a word break
# 2. match a word-like character and capture in a group
# 3. lookahead for some more characters + the substring "'s"

>>> my_re = re.compile(r"\b(\w)(?=\w+'s)")
>>> re.search(my_re, "bruce's computer")
<_sre.SRE_Match object; span=(0, 1), match='b'>

>>> re.search(my_re, "bruce's computer").group(1)
'b'

对于这个例子,它按预期工作。所以,我认为所有要做的就是在 sub 中的第一个组上调用 upper,它应该可以工作,对吧?

>>> re.sub(my_re, r'\1'.upper(), "bruce's computer")
"bruce's computer"

这不是预期的或明显的,为什么它不是首都。经过一些研究,我在 re.sub 文档中找到了这个......

Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed. If it is a callable, it's passed the match object and must return a replacement string to be used.

确实传递一个可调用对象确实有效...

>>> re.sub(my_re, lambda x: x.group(1).upper(), "bruce's computer")
"Bruce's computer"

太棒了。我想了解的是为什么这样做有效,否则我将不记得如何在不查找的情况下为此类实例正确使用 API。任何方向将不胜感激。

最佳答案

第二个参数可以是字符串或可调用对象。

re.sub(my_re, r'\1'.upper(), "bruce's computer"):你正在传递一个 \1 字符串sub 函数(上层与否,无关紧要)

re.sub(my_re, lambda x: x.group(1).upper(), "bruce's computer"):你正在传递一个可调用,所以 upper() 起作用是因为它应用于结果。

x.group(1).upper() 没有立即求值,因为它包含在 lambda 表达式中,相当于非 lambda:

def func(x):
return x.group(1).upper()

你也可以传递给re.sub:re.sub(my_re, func, "bruce's computer"),注意缺少() 在那种情况下!

关于python - 为什么我必须将可调用对象传递给 re.sub 以生成大写字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com