Есть ли способ заставить python str.partition игнорировать регистр? - PullRequest
1 голос
/ 30 марта 2011

Я пытаюсь заставить функцию Python str.partition игнорировать регистр во время поиска, поэтому

>>>partition_tuple = 'Hello moon'.partition('hello')
('', 'Hello', ' moon')

и

>>>partition_tuple = 'hello moon'.partition('hello')
('', 'hello', ' moon')

возврат, как показано выше.

Стоит ли вместо этого использовать регулярные выражения?

Спасибо

EDIT:

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

Пример:

'this is a contrived example' 

с ключевым словом 'придуманный' станет:

'this is a <<contrived>> example'

и мне нужно, чтобы он выполнял << >>, даже если слово «придумано» было написано с большой буквы «C».

Обратите внимание, что любая буква в слове может быть заглавной, а не только начальная.

Дело должно быть сохранено.

Еще одним уникальным моментом этой проблемы является то, что может быть несколько ключевых слов. На самом деле, здесь даже может быть ключевая фраза. То есть в приведенном выше примере ключевые слова могли быть «надуманными» и «надуманными», и в этом случае результат должен выглядеть следующим образом:

'this is <<a contrived>> example.'

Ответы [ 6 ]

2 голосов
/ 30 марта 2011

Как насчет

re.split('[Hh]ello', 'Hello moon')

Это дает

['', ' moon']

Теперь у вас есть кусочки, и вы можете собрать их вместе, как вам угодно. И это сохраняет дело.

[редактировать]
Вы можете поместить несколько ключевых слов в одно регулярное выражение (но прочтите предостережение ниже)

re.split(r'[Hh]ello | moon', 'Hello moon')

Внимание: re будет использовать ПЕРВЫЙ, который соответствует, а затем проигнорирует остальные.

Таким образом, добавление нескольких ключевых слов полезно только в том случае, если в каждой цели есть одно ключевое слово.

1 голос
/ 30 марта 2011

Какова реальная проблема, которую вы пытаетесь использовать partition ()?

Нет, partition () чувствителен к регистру, и нет пути к этому, кроме как путем нормализации первичной строки.

1 голос
/ 30 марта 2011

Как насчет

'Hello moon'.lower().partition('hello')
1 голос
/ 30 марта 2011

Вы можете сделать это, если вам не нужно сохранять регистр:

>>> partition_tuple = 'Hello moon'.lower().partition('hello')
>>> partition_tuple
('', 'hello', ' moon')
>>> 

Однако, как вы можете видеть, результирующий кортеж также становится строчным.Вы не можете сделать раздел нечувствительным к регистру.

0 голосов
/ 01 февраля 2012

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

def case_partition(text, sep):
    ltext = text.lower()
    lsep = sep.lower()
    ind = ltext.find(lsep)
    seplen = len(lsep)
    return (text[:ind], text[ind:ind+seplen], text[ind+seplen:])
0 голосов
/ 30 марта 2011

Возможно, больше информации о задаче поможет нам дать лучший ответ.Например, является ли ответ Бастьена достаточным, или же необходимо сохранить регистр?

Если строка содержит встроенное пространство, вы можете просто использовать функцию str.split (sep).

Но яЯ предполагаю, что вы имеете в виду более сложную задачу.Пожалуйста, опишите это подробнее.

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