2015-03-05 2 views
3

У меня есть файл, как один цен ниже Regex питон сжатие строки

Я хочу, чтобы напечатать кулак и последнее вхождение каждой общей подстроки так - \imm_pt_z4a[0], \imm_pt_z4a[1] становится \imm_pt_z4[0:1]

mod pez(ck2_imm_z4a, ck2_lt_func_z4a, ck2_or0_z4a, ck2_opr1_z4a, 
     ck2_oprk_z4a, ck2_oprl_z4a, ck2_oprm_z4a, ck2_wtn_z404a, 
     ck2_wtx_z404a, \imm_pt_z4a[0] , \imm_pt_z4a[1] , ldimm_z42b_b, 
     lt_anden_z4a, \lt_imm_z4a_b[0] , \lt_imm_z4a_b[1] , 
     \lt_imm_z4a_b[2] , \lt_imm_z4a_b[3] , \lt_imm_z4a_b[4] , 
     \lt_imm_z4a_b[5] , \lt_imm_z4a_b[6] , \lt_imm_z4a_b[7] , 
     \lt_imm_z4a_b[8] , \lt_imm_z4a_b[9] , \lt_imm_z4a_b[10] , 
     \or0_z42b_b[0] , \or0_z42b_b[1] , \or0_z42b_b[2] , 
     \or0_z42b_b[3] , \or0_z42b_b[4] , \or0_z42b_b[5] , 
     \or0_z42b_b[6] , \or0_z42b_b[7] , \or0_z42b_b[8] , 

Я пытаюсь это регулярное выражение

(\b[^\\;]+)\\([^[]+)\[(\d+)\][^;]+\2\[(\d+)\] 

используя эту функцию, чтобы заменить

\1\2[\3:\4] 

https://regex101.com/r/vT3xC1/2

Первая группа всегда находится правильно, но следующая группа строк я всегда скучаю первый так выход

mod pecl (ck2_imm_z4a, ck2_lt_func_z4a, ck2_or0_z4a, ck2_opr1_z4a, 
    ck2_oprk_z4a, ck2_oprl_z4a, ck2_oprm_z4a, ck2_wtn_z404a, 
    ck2_wtx_z404a, ldimm_z42b_b, 
    lt_anden_z4a, lt_imm_z4a_b[0:31] , 
    \lt_result_z4a[0] , lt_result_z4a[1:63] ,\lt_tbl_z4a[0] , lt_tbl_z4a[1:10] , 

Это должно было

mod pecl (ck2_imm_z4a, ck2_lt_func_z4a, ck2_or0_z4a, ck2_opr1_z4a, 
    ck2_oprk_z4a, ck2_oprl_z4a, ck2_oprm_z4a, ck2_wtn_z404a, 
    ck2_wtx_z404a, ldimm_z42b_b, 
    lt_anden_z4a, lt_imm_z4a_b[0:31] , 
    \lt_result_z4a[0:63] ,\lt_tbl_z4a[0:10] , 

Обратите внимание, как последняя строка, которую я получаю, ->

\ l t_result_z4a [0], lt_result_z4a [1:63] \ lt_tbl_z4a [0], lt_tbl_z4a [1:10],

То, что я должен был получить это

\ lt_result_z4a [0:63], \ lt_tbl_z4a [0:10],

Действительно оцените любую помощь для фиксации этого.

+0

** должен был быть выделен жирным шрифтом, а не на самом деле в строке. – Illusionist

+1

Если вы видите проблему с вашим вопросом, отредактируйте ее. –

+0

Исправлено, спасибо! – Illusionist

ответ

1

Заменить

(\\\w+)\[(\d+)\](?:\s*,\s*\1\[(\d+)\])+ 

с

\1[\2:\3] 

Конечно, \w предположение с моей стороны, но она подходит для вашего образца.

(\\\w+)  # a backslash and at least one word character, into group 1 
\[(\d+)\]  # multiple digits in square brackets, into group 2 
(?:   # start non-capturing group 
    \s*,\s*  # a comma surrounded by whitespace 
    \1   # same as group 1 
    \[(\d+)\] # multiple digits in square brackets, into group 3 
)+    # end non-capturing group, repeat 

Группа 3 будет содержать номер последнего, даже если оно соответствует несколько раз между ними.

+0

Спасибо, полная спасательная жизнь. , – Illusionist

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