Python re.sub从组中抓取一个字符

时间:2018-07-24 18:16:14

标签: python regex python-3.x

我遇到了一种情况,我想用一个字符从组中将字符串替换为子字符串。

示例。我的正则表达式是

^(\d{1,})\s?(ABC|DEF|GHI)

我想获得第一组的数字和仅首字母(即123 A)。

以下内容将抓住整个第二组-是否可以代替\ 2的第一个字符?

re.sub(regex_pattern, r'\1 \2', str)

当前输出:123 ABC

所需输出:123 A

2 个答案:

答案 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作为变量名是一个不好的主意,因为它也是内置类型。