【发布时间】:2017-01-12 20:11:12
【问题描述】:
下面是一个有点做作的例子,它回答了我最终的问题......
我想使用正则表达式将所有格名词的第一个字符大写。假设我有一个正则表达式(可能很差)匹配所有格名词。即...
### 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 文档中找到了这个......
返回替换最左边不重叠得到的字符串 替换 repl 在字符串中出现的模式。复制可以 可以是字符串或可调用的;如果是字符串,则反斜杠在其中转义 被处理。 如果它是可调用的,则传递匹配对象并 必须返回要使用的替换字符串。
确实传递一个可调用的确实有效...
>>> re.sub(my_re, lambda x: x.group(1).upper(), "bruce's computer")
"Bruce's computer"
太好了。我想了解的是为什么这会起作用,否则我不记得如何在不查找的情况下正确使用 API 来处理这种类型的实例。任何方向将不胜感激。
【问题讨论】:
-
在调用
sub函数之前评估参数。