Заменить первое и третье вхождение на другое регулярное выражение Python - PullRequest
0 голосов
/ 06 июля 2019

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

Итак, что я хочу, это

gere  should be gara 

cateral    should remain cateral  

Для этого я использую следующее регулярное выражение с использованием модуля re.

stg = "my string is here "
re.sub(r'e?e','a',stg)

Проблема с вышеприведенным выражением состоит в том, что оно правильно работает с gere и выдает результат gara

Но cateral также изменяется с cataral

Я хочу только там, где e (любой отдельный символ) e следует заменить на (любой отдельный символ) a

Пожалуйста, дайте мне знать, что я здесь делаю неправильно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Я согласен с ответом @ wiktor-stribiżew, но сделал рабочий пример.Я также сделал заметку в нижней части этой страницы учебника Google.

По сути, мы хотим заменить непоследовательные значения 'e', ​​которые могут иметь букву в середине (пробел)для меня это означало бы отдельное слово и не соответствовало бы шаблону)что обратное верно.Мы хотим «захватить» и сохранить все, что находится между двумя буквами, заменяя их буквами «а».

В любом случае, вот мое решение:

import re

sstr = """
gere  should be gara 

cateral    should remain cateral 
"""

### Our pattern captures and preserves whatever is in between the e's
### Note that \w+? is non-greedy and looks for at least one word character between the e's.
regex = r'e(\w+?)e'

### We then sub out the e's and replace the middle with out capture group, which is group(1).
### Like \w, the backslash escapes the 1 for group-referencing purposes.
### If you had two groups, you could retain the second one with \2, and so on.
new_str = re.sub(regex, r'a\1a', sstr)

### Output answer to the terminal.
print(new_str)

Вывод:

gara  should be gara 

cateral    should remain cateral 
0 голосов
/ 06 июля 2019

Регулярное выражение e?e соответствует необязательному e, а затем e, поэтому ваша команда re.sub(r'e?e','a',stg) заменяет каждое вхождение ee или e на a. Например. geese превратится в gase и get в gat.

Вы можете использовать одно из следующих:

re.sub(r'e(.)e', r'a\1a', stg)         # . - any char but line break char
re.sub(r'e([a-z])e', r'a\1a', stg)     # [a-z] - any lowercase ASCII letter
re.sub(r'e([^\W\d_])e', r'a\1a', stg)  # [^\W\d_] - any Unicode letter

См. Демоверсию Python онлайн .

Детали регулярного выражения:

  • e - соответствует e
  • (.) - захватывает любой символ, кроме символа разрыва строки, в группу 1
  • e - e
  • \1 в шаблоне замены вставляет то же значение, которое хранится в буфере памяти группы 1.

См. Демонстрационную версию regex онлайн .

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