2015-03-07 6 views
0

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

ID12345678_S3_MPRAGE_ADNI_32Ch_2_98_clone_transform_clone_reg_N3Corrected1_mask_cp_strip_durastripped_N3Corrected_clone_lToads_lesions_seg 

с

ID12345678 

Как я могу заменить это с помощью регулярных выражений?

Я пробовал это - он не работал.

import re 
re.sub(r'_\w+_\d_\d+_\w+','') 

Спасибо

+1

're.sub (г '_ \ ш + _ \ d_ \ d + _ \ w + ',' ') 'ничего не сделает - вам нужны 3 аргумента, и если вы хотите' re.match', второй аргумент должен быть вашей длинной строкой ввода, а не пустая строка. Кроме того, если '' 'ваша длинная строка ввода, наивным решением будет просто' s [0:10] 'или' s [0: s.find ('_')] '. – jedwards

+0

, если вы просто хотите, чтобы число и начало каждой строки просто использовали find, как показано на рисунке @jedwards. – letsc

+0

Я думаю, что вы действительно хотите 're.match' (если строка гарантирована в начале ввода) или' re .search' в противном случае, а не 're.sub' - при условии, по крайней мере, вы не пытаетесь сделать замену в строке в гораздо более длинной строке. – jedwards

ответ

1

Вы можете использовать re.sub с рисунком [^_]*, которые соответствуют любой подстроке из текста, который не содержит _ и, как re.sub заменить образец для первого матча вы можете использовать его в этом случае:

>>> s="ID12345678_S3_MPRAGE_ADNI_32Ch_2_98_clone_transform_clone_reg_N3Corrected1_mask_cp_strip_durastripped_N3Corrected_clone_lToads_lesions_seg" 
>>> import re 
>>> re.sub(r'([^_]*).*',r'\1',s) 
'ID12345678' 

Но если это может быть появиться где-либо в вашей строке вы можете использовать re.search следующим образом:

>>> re.search(r'ID\d+',s).group(0) 
'ID12345678' 
>>> s="_S3_MPRAGE_ADNI_ID12345678_32Ch_2_98_clone_transform_clone_reg_N3Corrected1_mask_cp_strip_durastripped_N3Corrected_clone_lToads_lesions_seg" 
>>> re.search(r'ID\d+',s).group(0) 
'ID12345678' 

Но без регулярных выражений просто вы можете использовать split():

>>> s.split('_',1)[0] 
'ID12345678' 
+0

Спасибо - первый вариант работает очень. Но так как мой очень длинный ID находится в pandas-dataframe, который читается из csv-файла, он не работает. Должен ли я добавить что-то в этом случае, например, \ b для границы? – Annamarie

+0

Еще один вопрос - \ 1 относится к первой группе захвата? Итак, как он узнает, какие символы разделяют группы захвата? Спасибо. – Annamarie

+1

Я нашел это - если регулярное выражение используется в pandas dataframe.replace() regex = True должно быть установлено. – Annamarie

0

Я предполагаю, что первая часть является переменной величиной, то

import re 
s = "ID12345678_S3_MPRAGE_ADNI_32Ch_2_98_clone_transform_clone_reg_N3Corrected1_mask_cp_strip_durastripped_N3Corrected_clone_lToads_lesions_seg" 
print re.sub(r'_.*$', r'', s) 
Смежные вопросы