Как заменить регулярное выражение в нижний регистр в Python - PullRequest
6 голосов
/ 15 апреля 2010

Я хочу найти ключевые слова (ключи будут динамическими) и заменить их в определенном формате.Например: эти данные

keys = ["cat", "dog", "mouse"]
text = "Cat dog cat cloud miracle DOG MouSE"

пришлось преобразовать в

converted_text = "[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)"

Вот мой код:

keys = "cat|dog|mouse"
p = re.compile(u'\\b(?iu)(?P<name>(%s))\\b' % keys)
converted_text = re.sub(p, '[\g<name>](\g<name>)', text)

И это работает нормально, только я могуне конвертировать последний параметр в нижний регистрЭто преобразуется следующим образом:

converted_text = "[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](DOG) [MouSE](MouSE)"

как я могу преобразовать последний параметр в нижний регистр?кажется, что python не может скомпилировать знак \ L.

Ответы [ 3 ]

10 голосов
/ 15 апреля 2010

Вы можете использовать функцию для замены:

pattern = re.compile('|'.join(map(re.escape, keys)), re.IGNORECASE)
def format_term(term):
    return '[%s](%s)' % (term, term.lower())

converted_text = pattern.sub(lambda m: format_term(m.group(0)), text)
3 голосов
/ 15 апреля 2010

нет необходимости использовать регулярное выражение

>>> keys = ["cat", "dog", "mouse"]
>>> text = "Cat dog cat cloud miracle DOG MouSE"
>>> for w in text.split():
...     if w.lower() in keys:
...        print "[%s]%s" %(w,w.lower()),
...     else:
...        print w,
...
[Cat]cat [dog]dog [cat]cat cloud miracle [DOG]dog [MouSE]mouse
1 голос
/ 16 апреля 2010

Исходя из предложенного вами решения, я предполагаю, что мне не нужно хранить ключи в виде списка (я буду использовать набор для ускорения поиска). Этот ответ также предполагает, что все слова в тексте разделены пробелом (который я буду использовать, чтобы соединить их обратно). Дайте это, вы можете использовать:

>>> keys = (["cat", "dog", "mouse"])
>>> text = "Cat dog cat cloud miracle DOG MouSE"
>>> converted =  " ".join(("[%s](%s)" % (word, word.lower()) if word.lower() in keys else word) for word in text.split())
>>> converted
'[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)'

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

>>> converted =  " ".join(("[%s](%s)" % (word, lower) if lower in keys else word) for word, lower in ((w, w.lower()) for w in text.split()))
>>> converted
'[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...