2014-02-02 2 views
0

Я пытаюсь удалить все несимволы и все символы, которые следуют за теми же символами из строки.Python regex удалить двойной символ из строки

Пример ввода «ABBBbcCCCCCD EF ZZZU» должен стать «ABCDDEFZU». В функции filter2 я пытаюсь записать двухзначную пару , так что я могу сравнить две буквы. Но я только сопоставляю настоящее совпадающее письмо, а не взгляд за буквой.

#!/usr/bin/python 
# coding: latin-1 

import re 
testfield = 'ABBBbbcCCCD EF ZZZU' 
def filter1(matchobj): 
    return '' 
def filter2(matchobj): 
    print('MATCH:' + matchobj.group(0)) 
    return matchobj.group(0) 

print(testfield) 

testfield2 = re.sub('[^A-Z0-9]', filter1, testfield, flags=re.IGNORECASE) 
print(testfield2) 

testfield2 = re.sub('[A-Z0-9](?=[A-Z0-9])', filter2, testfield2, flags=re.IGNORECASE) 

Как передать оба письма функции filter2 но до сих пор находят все возможные совпадения? print (testfield2)

+0

http://stackoverflow.com/questions/17885329/regex-to-remove-duplicate-letters – cherhan

+1

Как этот вход «ABBBbccCCCD EF ZZZU» станет «ABCDDEFZU», откуда приходит 2 D. –

+0

@yoyi - потому что это было сделано вручную ... (я взял D) – 576i

ответ

1

Вы должны использовать свои шаблоны регулярных выражений. И второй (предполагается, что вы имели в виду ABCDEFZU в конечный результат), используя обратные ссылки и лямбда-функции, чтобы вернуть прописную букву совпавшей части, вы можете сделать:

testfield2 = re.sub(r'([A-Z0-9])\1+', lambda m: m.group(1).upper(), testfield2, flags=re.IGNORECASE) 
print(testfield2) 

ideone demo

+0

Что касается * rawing * Я не узнал, как сырой шаблон, когда шаблон хранится в строке. например, 'pattern =" ([A-Z0-9]) \ 1+ "' 'testfield = re.sub (pattern ...' – 576i

+0

@ 576i Точно так же вы делаете 'pattern = r '([A- Z0-9]) \ 1+ "' – Jerry

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