Python: заменить строку на prefixStringSuffix, сохраняя исходный регистр, но игнорируя регистр при поиске соответствия - PullRequest
2 голосов
/ 04 мая 2009

Итак, я пытаюсь заменить строку «ключевое слово» на "<b>keyword</b>" в большей строке.

Пример:

myString = "HI там. Вы должны выше этого человека для работы. Привет привет."

keyword = "hi"

результат, который я хотел бы получить:

result = "<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>."

Я не буду знать, что такое ключевое слово, пока пользователь не введет ключевое слово и не будет знать корпус (myString), пока не будет выполнен запрос.

Я нашел решение, которое работает большую часть времени, но имеет некоторые ложные срабатывания, namely it would return "<b>hi<b/>gher" это не то, что я хочу. Также обратите внимание, что я Я пытаюсь сохранить регистр исходного текста, и соответствие должно занять место независимо от случая. поэтому, если ключевое слово "привет", оно должно заменить HI with <b>HI</b> and hi with <b>hi</b>.

Самое близкое, что я пришел, - это использование слегка производной версии этого: http://code.activestate.com/recipes/576715/ но я все еще не мог понять, как сделать второй проход строки, чтобы исправить все ложные срабатывания, упомянутые выше.

Или с помощью WordPunctTokenizer NLTK (который упрощает некоторые вещи, такие как пунктуация) но я не уверен, как бы я собрал предложения, учитывая, что это не есть обратная функция, и я хочу сохранить первоначальную пунктуацию myString. Существенно, выполнение конкатенации всех токенов не возвращает оригинал строка. Например, я не хотел бы заменять «7-7» на «7-7» при перегруппировке токенов в исходный текст, если исходный текст содержал «7-7».

Надеюсь, это было достаточно ясно. Кажется, простая проблема, но это оказалось немного сложнее, чем я думал.

Ответы [ 4 ]

3 голосов
/ 04 мая 2009

Это нормально?

>>> import re
>>> myString = "HI there. You should higher that person for the job. Hi hi."
>>> keyword = "hi"
>>> search = re.compile(r'\b(%s)\b' % keyword, re.I)
>>> search.sub('<b>\\1</b>', myString)
'<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>.'

Ключ ко всему этому - использование границ слов , групп и флага re.I .

0 голосов
/ 20 июля 2009

Вот одно предложение от комитета по придиркам. : -)

myString = "HI there. You should higher that person for the job. Hi hi."

myString.replace('higher','hire')
0 голосов
/ 04 мая 2009

Я думаю, что лучшим решением было бы регулярное выражение ...

import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)

Конечно, вы должны сначала сделать ваше ключевое слово «безопасным регулярным выражением» (заключите в кавычки любые специальные символы регулярного выражения).

0 голосов
/ 04 мая 2009

Вы можете легко это сделать с помощью re.sub, используя утверждение границы слова \b, которое соответствует только границе слова:

import re

def SurroundWith(text, keyword, before, after):
  regex = re.compile(r'\b%s\b' % keyword, re.IGNORECASE)
  return regex.sub(r'%s\0%s' % (before, after), text)

Тогда вы получите:

>>> SurroundWith('HI there. You should hire that person for the job. '
...              'Hi hi.', 'hi', '<b>', '</b>')
'<b>HI</b> there. You should hire that person for the job. <b>Hi</b> <b>hi</b>.'

Если у вас есть более сложные критерии для того, что составляет «границу слова», вам придется сделать что-то вроде:

def SurroundWith2(text, keyword, before, after):
  regex = re.compile(r'([^a-zA-Z0-9])(%s)([^a-zA-Z0-9])' % keyword,
                     re.IGNORECASE)
  return regex.sub(r'\1%s\2%s\3' % (before, after), text)

Вы можете изменить группы [^a-zA-Z0-9] так, чтобы они соответствовали всему, что вы считаете "не словом".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...