Отдельное слово и цифры с регулярным выражением - PullRequest
2 голосов
/ 03 апреля 2020

Я борюсь с разделением данной строки foobar123 между словом и ди git неизвестной длины с подчеркиванием (Результат: foobar_123). Я пытался использовать регулярные выражения, чтобы найти соответствие r1 (работает). Но после этого я понятия не имею, как отделить соответствующее совпадение.

import re
x = "foobar123"
y = re.sub("[a-z]{1}\d{1}", "\1", x)
print(y) # Output: "fooba23"

Я думаю, что это должно быть сделано с "\ 1" для доступа к предыдущему совпадению. Поэтому я попытался заменить найденное совпадение на себя, но это приводит к: fooba23. Не должно быть foobar123.

Заранее спасибо.

ОБНОВЛЕНИЕ:

Извините за опечатку в приведенном выше коде, это должно быть [a-z], а не [0-9] .

Ответы [ 4 ]

6 голосов
/ 03 апреля 2020

Это может помочь, используя группу захвата ваших цифр?

import re
x = "foobar123"
y = re.sub(r'(\d+)', r'_\1', x)
print(y)

Я избежал обратной косой черты, используя необработанную строку. Что-то, что вы забыли сделать в вашем =)


Забавная альтернатива без группы захвата - использовать count параметр re.sub:

import re
x = "foobar123"
y = re.sub(r'(?=\d)', '_', x, 1)
print(y)

Шаблон (?=\d) возвращает все позиции, за которыми следует ди git, но только first (следовательно, 1 для count) заменяется подчеркиванием.

2 голосов
/ 03 апреля 2020

Вы сопоставляете 2 цифры, используя [0-9]{1}\d{1}, где {1} не требуется, и символ до того, как цифры не учитываются.

Вы можете выполнить замену без группы захвата, используя только совпадение \g<0> с последующим подчеркиванием.

Шаблон будет соответствовать символу [a-z] и использует положительный прогноз (?=\d), чтобы утверждать, что справа является di git.

import re
x = "foobar123"
y = re.sub("[a-z](?=\d)", "\g<0>_", x)
print(y) # Output: "foobar_123"
2 голосов
/ 03 апреля 2020

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

re.sub(r'([a-z])(?=\d)', r'\1_', x)
# 'foobar_123'
1 голос
/ 03 апреля 2020

Вы можете

  • захватить букву в одной части, а цифры в другой: ([a-z]+)([0-9]+)
  • заменить на группу букв, подчеркивание, цифры: \1_\2

Я добавил re.I для игнорирования

x = "Foobar123"
y = re.sub("([a-z]+)([0-9]+)", r"\1_\2", x, flags=re.I)
print(y)  # Foobar_123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...