2015-10-14 10 views
5

W poniższym wyrażeniu regularnym chciałbym, aby każdy znak w ciągu został zamieniony na "X", ale nie działa.Czy można wykonać wzorzec regex [a-zA-Z] w celu dopasowania i zastąpienia znaków Unicode w standardzie innym niż ASCII?

W Pythonie 2,7:

>>> import re 
>>> re.sub(u"[a-zA-Z]","X","dfäg") 
'XX\xc3\xa4X' 

lub

>>> re.sub("[a-zA-Z]","X","dfäg",re.UNICODE) 
u'XX\xe4X' 

W Pythonie 3,4:

>>> re.sub("[a-zA-Z]","X","dfäg") 
'XXäX' 

jest możliwe w pewnym sensie 'Konfiguracja' [A-zA-Z] wzór pasujący do "ä", "ü" itp.? Jeśli nie można tego zrobić, w jaki sposób mogę utworzyć podobny wzór zakresu znaków między nawiasami kwadratowymi, który zawierałby znaki Unicode w zwykłym zakresie "pełnego alfabetu"? Mam na myśli, na przykład w języku niemieckim, że "ä" zostanie umieszczone gdzieś w pobliżu "a" w alfabecie, więc można by oczekiwać, że będzie on włączony w zakres "a-z".

+0

użyć '\ w', to powinno wystarczyć. –

+0

Jeśli poprawnie rozumiem pytanie, '\ w' wykluczy wszystkie litery, które nie mieszczą się w zbiorze' [A-Za-z] '. Próbowałem go [tutaj] (https://regex101.com/r/rR2hZ1/1). – npinti

+0

@ npinti: z modyfikatorem Unicode [pasuje do litery z akcentem] (https://regex101.com/r/rR2hZ1/2). –

Odpowiedz

4

Można użyć

(?![\d_])\w 

z modyfikatorem Unicode. Współczynnik skrótu (?![\d_]) ogranicza się do skróconej klasy, ponieważ nie może być zgodna z żadnymi cyframi (\d) lub podkreśleniami.

Zobacz regex demo

Python 3 demo:

import re 
print (re.sub(r"(?![\d_])\w","X","dfäg")) 
# => XXXX 

chodzi o Python 2:

# -*- coding: utf-8 -*- 
import re 
s = "dfäg" 
w = re.sub(ur'(?![\d_])\w', u'X', s.decode('utf8'), 0, re.UNICODE).encode("utf8") 
print(w) 
+1

Tylko uwaga: w systemie Windows, w Pythonie 2.x, można dodać instrukcję '# coding: utf-8' w celu wymuszenia kodowania UTF8 dla źródła. –

Powiązane problemy