Python re.sub захватывает один символ из группы

Я столкнулся с сценарием, в котором я хочу подписать ^ ( d { 1 ,}) s ? ( ABC | DEF | GHI ) с одним символом из группы.

Пример. Мое регулярное выражение

re.sub(regex_pattern, r'1 2', str)

Я хочу получить цифры и только первую букву первой группы (т. Е. Re.sub).

Следующее возьмет всю вторую группу - возможно ли захватить первый символ 2?

match

Токовый выход: re . sub ( regex_pattern , lambda m : "{} {}" . format ( m . group ( 1 ), m . group ( 2 ) [ 0 ]), текст )

Желаемый результат: 123 A

python,regex,python-3.x,

1

Ответов: 2


1 принят

Вы можете передать функцию в качестве замены text. Функция будет вызываться с strобъектом в качестве аргумента, который вы можете использовать для построения замены ^ ( d {1,}) s? (A (? = BC) | D (? = EF) | G (? = HI)) .. Ing. Для вашей ситуации я бы попробовал что-то вроде этого:

re.sub(regex_pattern, r'1 2', str)

Обратите внимание, что я переименовал вашу strпеременную в text, так как это плохая идея использовать strв качестве имени переменной, так как она также является встроенным типом.


2

Вы можете сделать это так 123 ABC

Это обрезает оставшиеся 2 символа.

так, 123 Aбудет конвертировать

123 ABC в 123 A


обновить данные

Если вы используете новый модуль регулярных выражений Python , у вас будет доступ к конструкции сброса ветвей.

Тогда это так же просто, как положить группу захвата (2) вокруг первых букв
(или любую конкретную букву в любом конкретном пункте см. Примечание 1 ) всего в чередовании ist.

Это позволяет избежать обратного вызова, тем самым повышая производительность, и позволяет
добавлять интенсивные конструкции в список сброса филиала.

^(d{1,})s?(?|(A)BC|(D)EF|(G)HI)

https://regex101.com/r/S9XBpb/1

Читаемая версия

 ^ 
 ( d{1,} )                    # (1)
 s? 
 (?|                           # Branch reset 
      ( A )                         # (2)
      BC
   |  
      ( D )                         # (2)
      EF
   |  
      ( G )                         # (2)
      HI 
 )

примечание 1 :
https://regex101.com/r/S9XBpb/2
https://regex101.com/r/S9XBpb/3 <- Не удалось сделать это с помощью обратного вызова

питон, регулярное выражение, питон-3.x,
Похожие вопросы