我遇到了一种情况,我想用一个字符从组中将字符串替换为子字符串。
示例。我的正则表达式是
^(\d{1,})\s?(ABC|DEF|GHI)
我想获得第一组的数字和仅首字母(即123 A)。
以下内容将抓住整个第二组-是否可以代替\ 2的第一个字符?
re.sub(regex_pattern, r'\1 \2', str)
当前输出:123 ABC
所需输出:123 A
答案 0 :(得分:2)
您可以像这样^(\d{1,})\s?(A(?=BC)|D(?=EF)|G(?=HI))..
这将截断其余2个字符。
因此,re.sub(regex_pattern, r'\1 \2', str)
将转换
123 ABC
至 123 A
更新信息
如果您使用新的Python regex 模块,则可以访问分支重置构造。
然后,就像将捕获组(2)放在第一个字母周围一样简单
(或任何特定字母,在任何特定项目中参见注释1 )。
这避免了回调,从而提高了性能,并使您
在分支重置列表中添加密集结构。
^(\d{1,})\s?(?|(A)BC|(D)EF|(G)HI)
https://regex101.com/r/S9XBpb/1
可读版本
^
( \d{1,} ) # (1)
\s?
(?| # Branch reset
( A ) # (2)
BC
|
( D ) # (2)
EF
|
( G ) # (2)
HI
)
注释1 :
https://regex101.com/r/S9XBpb/2
https://regex101.com/r/S9XBpb/3 <-无法通过回调做到这一点
答案 1 :(得分:1)
您可以将函数作为替换传递给re.sub
。该函数将以match
对象作为参数来调用,您可以使用该对象来构建替换字符串。对于您的情况,我会尝试这样的事情:
re.sub(regex_pattern, lambda m: "{} {}".format(m.group(1), m.group(2)[0]), text)
请注意,我已经将您的str
变量重命名为text
,因为使用str
作为变量名是一个不好的主意,因为它也是内置类型。