Регулярные выражения, но для записи в матче - PullRequest
1 голос
/ 26 сентября 2008

При использовании регулярных выражений мы обычно, если не всегда, используем их для извлечения некоторой информации. Что мне нужно, это заменить значение совпадения другим значением ...

Прямо сейчас я делаю это ...

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 ]

7 голосов
/ 26 сентября 2008
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'
2 голосов
/ 26 сентября 2008

Вы хотите использовать 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'
1 голос
/ 26 сентября 2008

Конечно. Смотрите методы 'sub' и 'subn' скомпилированных регулярных выражений или функции 're.sub' и 're.subn'. Вы можете либо заставить его заменить совпадения заданным строковым аргументом, либо передать вызываемый объект (например, функцию), который будет вызван для замены. Смотри https://docs.python.org/library/re.html

0 голосов
/ 27 сентября 2008
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)

Редактировать: Разрешить ссылки захвата в строках замены.

0 голосов
/ 26 сентября 2008

Если вы хотите продолжить использовать упомянутый вами синтаксис (замените значение соответствия вместо замены части, которая не соответствует), и, учитывая, что у вас будет только одна группа, вы можете использовать код ниже.

def getExpandedText(pattern, text, replaceValue):
    m = re.search(pattern, text)
    expandedText = text[:m.start(1)] + replaceValue + text[m.end(1):]
    return expandedText
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...