正则表达式,但用于在匹配中写入

时间:2008-09-26 15:22:06

标签: python regex

当使用正则表达式时,我们通常会使用它们来提取某种信息。我需要的是用其他值替换匹配值...

现在我正在这样做......

def getExpandedText(pattern, text, replaceValue):
    """
        One liner... really ugly but it's only used in here.
    """

    return text.replace(text[text.find(re.findall(pattern, text)[0]):], replaceValue) + \
            text[text.find(re.findall(pattern, text)[0]) + len(replaceValue):]

所以,如果我喜欢

>>> getExpandedText("aaa(...)bbb", "hola aaaiiibbb como estas?", "ooo")
'hola aaaooobbb como estas?'

用'ooo'改变(...)。

你们知道用python正则表达式我们能做到吗?

非常感谢你们!

5 个答案:

答案 0 :(得分:7)

sub (replacement, string[, count = 0])

sub返回通过替换替换替换字符串中RE的最左边非重叠出现而获得的字符串。如果找不到模式,则返回字符串不变。

    p = re.compile( '(blue|white|red)')
    >>> p.sub( 'colour', 'blue socks and red shoes')
    'colour socks and colour shoes'
    >>> p.sub( 'colour', 'blue socks and red shoes', count=1)
    'colour socks and red shoes'

答案 1 :(得分:2)

您想使用re.sub

>>> import re
>>> re.sub(r'aaa...bbb', 'aaaooobbb', "hola aaaiiibbb como estas?")
'hola aaaooobbb como estas?'

要重复使用模式中的变量部分,请使用替换字符串中的\g<n>来访问第n个()组:

>>> re.sub( "(svcOrdNbr +)..", "\g<1>XX", "svcOrdNbr               IASZ0080")
'svcOrdNbr               XXSZ0080'

答案 2 :(得分:1)

当然。请参阅已编译正则表达式的'sub'和'subn'方法,或're.sub'和're.subn'函数。您可以使用您给出的字符串参数替换匹配项,也可以传递将被调用以提供替换项的可调用项(例如函数)。见https://docs.python.org/library/re.html

答案 3 :(得分:0)

如果你想继续使用你提到的语法(替换匹配值而不是替换不匹配的部分),并且考虑到你只有一个组,你可以使用下面的代码。

def getExpandedText(pattern, text, replaceValue):
    m = re.search(pattern, text)
    expandedText = text[:m.start(1)] + replaceValue + text[m.end(1):]
    return expandedText

答案 4 :(得分:0)

def getExpandedText(pattern,text,*group):
    r""" Searches for pattern in the text and replaces
    all captures with the values in group.

    Tag renaming:
    >>> html = '<div> abc <span id="x"> def </span> ghi </div>'
    >>> getExpandedText(r'</?(span\b)[^>]*>', html, 'div')
    '<div> abc <div id="x"> def </div> ghi </div>'

    Nested groups, capture-references:
    >>> getExpandedText(r'A(.*?Z(.*?))B', "abAcdZefBgh", r'<\2>')
    'abA<ef>Bgh'
    """
    pattern = re.compile(pattern)
    ret = []
    last = 0
    for m in pattern.finditer(text):
        for i in xrange(0,len(m.groups())):
            start,end = m.span(i+1)

            # nested or skipped group
            if start < last or group[i] is None:
                continue

            # text between the previous and current match
            if last < start:
                ret.append(text[last:start])

            last = end
            ret.append(m.expand(group[i]))

    ret.append(text[last:])
    return ''.join(ret)

编辑:允许替换字符串中的捕获引用。