捕获正则表达式的内容并有效地删除它们

时间:2008-10-15 14:05:56

标签: python regex

情况:

  • text:一个字符串
  • R:匹配部分字符串的正则表达式。这可能是昂贵的计算。

我想从文本中删除R-matches,并查看它们实际包含的内容。目前,我这样做:

import re
ab_re = re.compile("[ab]")
text="abcdedfe falijbijie bbbb laifsjelifjl"
ab_re.findall(text)
# ['a', 'b', 'a', 'b', 'b', 'b', 'b', 'b', 'a']
ab_re.sub('',text)
# 'cdedfe flijijie  lifsjelifjl'

正如我所知,这会运行正则表达式两次。是否有一种技术可以通过,也许使用re.split?看起来像基于分裂的解决方案,我需要至少两次正则表达式。

4 个答案:

答案 0 :(得分:4)

import re

r = re.compile("[ab]")
text = "abcdedfe falijbijie bbbb laifsjelifjl"

matches = []
replaced = []
pos = 0
for m in r.finditer(text):
    matches.append(m.group(0))
    replaced.append(text[pos:m.start()])
    pos = m.end()
replaced.append(text[pos:])

print matches
print ''.join(replaced)

输出:

['a', 'b', 'a', 'b', 'b', 'b', 'b', 'b', 'a']
cdedfe flijijie  lifsjelifjl

答案 1 :(得分:4)

这个怎么样:

import re

text = "abcdedfe falijbijie bbbb laifsjelifjl"
matches = []

ab_re = re.compile( "[ab]" )

def verboseTest( m ):
    matches.append( m.group(0) )
    return ''

textWithoutMatches = ab_re.sub( verboseTest, text )

print matches
# ['a', 'b', 'a', 'b', 'b', 'b', 'b', 'b', 'a']
print textWithoutMatches
# cdedfe flijijie  lifsjelifjl

re.sub 函数的'repl'参数可以是一个函数,因此您可以从那里报告或保存匹配项,无论函数返回什么,'sub'将替换。

可以轻松修改该功能以进行更多操作!查看docs.python.org上的the re module documentation,了解有关其他可能的更多信息。

答案 2 :(得分:3)

我修改后的答案,使用 re.split(),它在一个正则表达式中传递:

import re
text="abcdedfe falijbijie bbbb laifsjelifjl"
ab_re = re.compile("([ab])")
tokens = ab_re.split(text)
non_matches = tokens[0::2]
matches = tokens[1::2]

(编辑:这是一个完整的功能版本)

def split_matches(text,compiled_re):
    ''' given  a compiled re, split a text 
    into matching and nonmatching sections
    returns m, n_m, two lists
    '''
    tokens = compiled_re.split(text)
    matches = tokens[1::2]
    non_matches = tokens[0::2]
    return matches,non_matches

m,nm = split_matches(text,ab_re)
''.join(nm) # equivalent to ab_re.sub('',text)

答案 3 :(得分:0)

您可以使用拆分捕获parantheses。如果这样做,那么模式中所有组的文本也将作为结果列表的一部分返回(来自python doc)。

所以代码是

import re
ab_re = re.compile("([ab])")
text="abcdedfe falijbijie bbbb laifsjelifjl"
matches = ab_re.split(text)
# matches = ['', 'a', '', 'b', 'cdedfe f', 'a', 'lij', 'b', 'ijie ', 'b', '', 'b', '', 'b', '', 'b', ' l', 'a', 'ifsjelifjl']

# now extract the matches
Rmatches = []
remaining = []
for i in range(1, len(matches), 2):
    Rmatches.append(matches[i])
# Rmatches = ['a', 'b', 'a', 'b', 'b', 'b', 'b', 'b', 'a']

for i in range(0, len(matches), 2):
    remaining.append(matches[i])
remainingtext = ''.join(remaining)
# remainingtext = 'cdedfe flijijie  lifsjelifjl'