Python регулярное выражение, как вставить символ дефиса между алфавитом и цифрой; а также удалить дефис между двумя алфавитами - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь использовать регулярное выражение для выполнения следующих действий в строке:

  • Если между двумя алфавитами есть дефис -, мы должны удалить его:
    • Пример: A-BA должно быть ABA; и A-B-BAB должно быть ABBAB
  • Если алфавит и число находятся рядом друг с другом, то мы должны вставить между ними символ дефиса -:
    • Пример 9AHYA7 должно быть 9-AHYA-7; и 977AB99T5 должно быть 977-AB-99-T-5

Эти шаблоны являются простыми примерами. Строка может быть более сложной, например:

  • HS98743YVJUHGF78BF8HH3JHFC83438VUN5498FCNG
  • 7267-VHSBVH8737HHC8C-HYHFWYFHH-7Y84743YR8437G

В приведенных выше строках должны быть включены те же принципы. .

Я пробовал следующий код преобразовать 8T в 8-T

    re.sub(r'\dab-d', '\d-ab-d', s)

К сожалению, это не работает. Не знаю, как это сделать.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

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

Если группа 1 совпала, удалите последний символ. Если совпала группа 2, добавьте дефис.

([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))

Пояснение

  • ( Захват группа 1
    • [A-Z]-(?=[A-Z]) Сопоставьте AZ и - и подтвердите, что справа - AZ
  • ) Закрыть группу
  • | Или
  • ( Захват группа 2
    • [A-Z](?=[0-9]) Сопоставьте AZ и подтвердите, что справа - di git
    • | Или
    • [0-9](?=[A-Z]) Сопоставьте 0-9 и подтвердите, что справа - AZ
  • ) Закрытая группа

Regex demo | Python демо

Пример кода

import re

pattern = r"([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))"
strings = [
    "A-BA",
    "A-B-BAB",
    "9AHYA7",
    "977AB99T5",
    "HS98743YVJUHGF78BF8HH3JHFC83438VUN5498FCNG",
    "7267-VHSBVH8737HHC8C-HYHFWYFHH-7Y84743YR8437G"
]

for str in strings:
    result = re.sub(
        pattern,
        lambda x: x.group(1)[:-1] if x.group(1) else x.group(2) + "-",
        str
    )
    print(result)

Вывод

ABA
ABBAB
9-AHYA-7
977-AB-99-T-5
HS-98743-YVJUHGF-78-BF-8-HH-3-JHFC-83438-VUN-5498-FCNG
7267-VHSBVH-8737-HHC-8-CHYHFWYFHH-7-Y-84743-YR-8437-G
1 голос
/ 05 мая 2020

Если вы хотите использовать re.sub, то вот один из способов с использованием групп захвата:

inp = "8T-ENI-A2"
output = re.sub(r'^(.)(.)-([^-]+)-(.)(.)$', '\\1-\\2\\3\\4-\\5', inp)
print(output)

Это напечатает:

8-TENIA-2
...