结合多个正则表达式替换

Ble*_*der 8 python regex

我正在尝试使用正则表达式删除文本块中的一些内容.我已准备好所有模式,但我似乎无法移除两个(或更多)重叠的模式.

例如:

import re

r1 = r'I am'
r2 = r'am foo'

text = 'I am foo'

re.sub(r1, '', text)   # Returns ' foo'
re.sub(r2, '', text)   # Returns 'I '
Run Code Online (Sandbox Code Playgroud)

如何同时替换两个匹配项并以空字符串结束?


我最后使用了一个稍微修改过的Ned Batchelder的答案:

def clean(self, text):
  mask = bytearray(len(text))

  for pattern in patterns:
    for match in re.finditer(pattern, text):
      r = range(match.start(), match.end())

      mask[r] = 'x' * len(r)

  return ''.join(character for character, bit in zip(text, mask) if not bit)
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 12

re.sub如您所示,您无法通过连续呼叫执行此操作.您可以使用re.finditer它们来查找它们.每场比赛将为您提供一个匹配对象,它.start.end属性表明自己的立场.您可以一起收集所有这些,然后在最后删除字符.

这里我使用a bytearray作为可变字符串,用作掩码.它被初始化为零字节,并且我用'x'标记所有匹配任何正则表达式的字节.然后我使用位掩码选择要保留在原始字符串中的字符,并构建一个只包含不匹配字符的新字符串:

bits = bytearray(len(text))
for pat in patterns:
    for m in re.finditer(pat, text):
        bits[m.start():m.end()] = 'x' * (m.end()-m.start())
new_string = ''.join(c for c,bit in zip(text, bits) if not bit)
Run Code Online (Sandbox Code Playgroud)