2016-12-13 3 views
-1

Я бы хотел заменить все вхождения подстроки регулярными выражениями. Исходные предложения были бы такими:Python: Заменить все вхождения подстрок регулярными выражениями

mystring = "Carl's house is big. He is asking 1M for that(the house)." 

Теперь давайте предположим, что у меня есть две подстроки, которые я хотел бы выделить. Я смел слова, добавляя ** в начале и в конце подстроки. В 2 подстроки:

substring1 = "house", so bolded it would be "**house**" 
substring2 = "the house", so bolded it would be "**the house**" 

В конце я хочу оригинальное предложение, как это:

mystring = "Carl's **house** is big. He is asking 1M for that(**the house**)." 

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

Carl's **house** is big. He is asking 1M for that(**the **house****). 

С другой стороны, если я анализирую кратчайшую подстроку первой, я получаю это:

Carl's **house** is big. He is asking 1M for that(the **house**). 

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

Примечание: // Предположим, что строка ** никогда не будет происходить в исходной строке, поэтому мы можем использовать его, чтобы полужирный наши слова

+0

['' 're.sub()' ''] (https://docs.python.org/3/library/re.html#re.sub) может принимать функцию для аргумента * repl *. Создайте шаблон, соответствующий вашим подстрокам, затем создайте функцию, которая принимает объект соответствия в качестве аргумента и возвращает эту строку, измененную, как вы хотите. – wwii

ответ

2

Вы можете найти все строки сразу, так что тот факт, что один является подстрока другой не имеет значения:

re.sub(r"(house|the house)", r"**\1**", mystring) 
+0

Что означает '\ 1'? Что означает '' '? – wwii

+0

@wwii '\ 1' относится к первой согласованной группе,' | 'является оператором' or', который помогает вам иметь шаблон, который является 'house'' или' 'house' – ashwinjv

+0

Он работает как волшебство. Благодаря! – user2288043

0

Вы могли бы сделать два прохода:

Первый: Пройдите из длинной в самой короткой и заменить что-то вроде:

  • 'дом': '' AA_THE_HOUSE
  • 'дом': 'BB_HOUSE'

Второе: Пройтись заменить как:

  • 'AA_THE_HOUSE': '**the house**'
  • 'BB_HOUSE': '**house**'
1

Вы могли бы иметь группу, которая не захваченный и является требуется примечание. Если вы посмотрите на regex patter (?P<repl>(?:the)?house), то часть (?:the)? говорит, что в строке может быть the, если она присутствует, включите ее в соответствие. Таким образом, вы позволяете библиотеке re оптимизировать способ ее соответствия. Вот полный пример

>>> data = "Carl's house is big. He is asking 1M for that(the house)." 
>>> re.sub('(?P<repl>(?:the)?house)', '**\g<repl>**', data) 
"Carl's **house** is big. He is asking 1M for that(**the house**)." 

Примечание: \g<repl> используется, чтобы получить все строки, совпавшие группы <repl>

0

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

Например:

'дом' с '' temp_the_house 'дома' с '' temp_house

затем 'temp_house' с 'дома' 'temp_the_house' с «** дом **** '

Должен работать нормально. Вы можете автоматизировать это, используя два списка.

Смежные вопросы