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