Как получить регулярное выражение Python для возврата всего текста не совпадает? - PullRequest
2 голосов
/ 03 мая 2011

Итак, я успешно сопоставляю и извлекаю какой-то специальный теговый текст, используя следующее регулярное выражение:

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
p = re.compile("\%%v:([0-9]*)%%")
theIds = p.findall(theString)

, которое возвращает

[u'123453', u'984561', u'123456']

, что именно то, что мне нужно.Затем мне нужно заменить те, у которых есть искомое значение, так что я хотел бы получить следующее:

[u'Var 1 value: ', u', Var 2 value: ', u', Var 3 value: ']

, чтобы я мог склеить эти строки вместе с искомыми значениями из первогоlist, в результате получается строка, которая выглядит примерно так:

u "Значение Var 1: некоторое значение, значение Var 2: 837, значение Var 3: больше вещей"

Или, если естьлучший способ сделать замену Я все уши.

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Как насчет следующего?

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
p = re.compile("\%%v:([0-9]*)%%")
replacements = ["Some Value", "837", "more stuff"]
newString = p.sub(lambda m: replacements.pop(0), theString)

Вы можете предоставить функцию для re.sub(), в этом случае функция берет первый элемент из списка replacements и заменяет его на совпадение.

edit : Я неправильно прочитал вопрос и пропустил, что вы хотите посмотреть значения замены на основе начальных значений, вы, вероятно, хотите что-то вроде ответ Мартин для вашей замены,Что касается возврата всего текста, не соответствующего, вы можете удалить группу в своем регулярном выражении и затем использовать re.split():

>>> theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
>>> p = re.compile("%%v:[0-9]*%%")
>>> p.split(theString)
[u'Var 1 value: ', u', Var 2 value: ', u', Var 3 value: ', u'']
2 голосов
/ 03 мая 2011

Используйте функцию замены для вставки произвольных замен.См. re.sub документацию о том, как работает эта функция.Вот пример:

values = {
    u'123453': u'Some Value',
    u'984561': u'837',
    u'123456': u'more stuff',
}

def insertLookup(matchobj):
    return values[matchobj.group(1)]

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"
p = re.compile("\%%v:([0-9]*)%%")
newString = p.sub(insertLookup, theString)

print newString
u"Var 1 value: Some Value, Var 2 value: 837, Var 3 value: more stuff"

Функция insertLookup будет вызываться для каждого совпадения, и ей передается MatchObject .Затем мы используем совпавшее значение (u'123453' и т. Д.), Чтобы найти замещающее значение, которое затем вставляется в newString вместо совпавшей строки.

0 голосов
/ 03 мая 2011

Вместо «p.findall» используйте «p.sub».

0 голосов
/ 03 мая 2011

Разве вы не можете просто split(', ') струну и работать с отдельными кусочками?

Моим наивным решением было бы что-то вроде этого:

theString = u"Var 1 value: %%v:123453%%, Var 2 value: %%v:984561%%, Var 3 value: %%v:123456%%"

for chunk in theString.split(', '):
  temp = str(chunk)

  p = re.compile("\%%v:([0-9]*)%%")
  theIds = p.findall(theString)

  theOpposite = temp.replace(theIds[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...