2013-09-06 24 views
8

Używam obecnie re.findall znaleźć i wyizolować słowa po znaku „#” dla tagów hash w ciąg:Jak rozliczać znaki akcentujące dla wyrażenia regularnego w Pythonie?

hashtags = re.findall(r'#([A-Za-z0-9_]+)', str1) 

Przeszukuje str1 i wyszukuje wszystkie hashtags. Działa to jednak nie uwzględnia znaków akcentowanych, takich jak te, na przykład: áéíóúñü¿.

Jeśli jedna z tych liter znajduje się w str1, zapisze ona hashtag aż do litery przed nim. Na przykład #yogenfrüz będzie #yogenfr.

muszę być w stanie wyjaśnić wszystkie litery akcentowane, które wahają się od niemieckim, holenderskim, francuskim i hiszpańskim, dzięki czemu można zaoszczędzić hashtags jak #yogenfrüz

Jak mogę to zabrać

+2

użyć 're.UNICODE' flagę. –

+0

@AshwiniChaudhary: flaga UNICODE nie sprawi, że zakres zastosowany będzie pasował do znaków spoza ASCII, no. Jeśli powiesz regexowi, żeby pasował do 'a-z', to bierze on literalny zakres, a nie ludzką interpretację, że' a' i 'á' w pewnym sensie są tym samym. –

+0

@MartijnPieters: więc, co to zrobi? ;-) – JohnTortugo

Odpowiedz

21

Spróbuj następujące:

hashtags = re.findall(r'#(\w+)', str1, re.UNICODE) 

Regex101 Demo

EDIT Sprawdź przydatny komentarz poniżej z Martijn Pieters.

+4

Małe zastrzeżenie: '\ w' nie pasuje do połączonych punktów kodowych, więc' a' i [U0103 COMBINING ACUTE ACCENT] (https://codepoints.net/U+0301) nie zostaną dopasowane, nawet jeśli * drukuje * jako "á". Najpierw powinieneś znormalizować do NFC. –

+0

@MartijnPieters Dzięki za udostępnienie, zawsze coś ekstra do nauki. –

+0

@IbrahimNajjar możesz wprowadzić poprawkę wspomnianą przez Martijna Pietersa do swojego rozwiązania? Dzięki. –

2

Można również użyć

import unicodedata 
output = unicodedata.normalize('NFD', my_unicode).encode('ascii', 'ignore') 

Jak przekonwertować wszystkie te znaki ewakuacyjne do swoich bohaterów jak jeśli jest Unicode, w jaki sposób mogę przekonwertować do Standard a? że masz załadowany swój unicode do zmiennej o nazwie my_unicode ... A do normalizacji a jest to proste ...

import unicodedata wyjściowy = unicodedata.normalize ('NFD' my_unicode) .encode ('ASCII' 'ignoruj') Explicit przykład ...

myfoo = u'àà' 
myfoo 
u'\xe0\xe0' 
unicodedata.normalize('NFD', myfoo).encode('ascii', 'ignore') 
'aa' 

kontrola ta odpowiedź to bardzo mi pomogło: How to convert unicode accented characters to pure ascii without accents?

+0

świetna odpowiedź berk! ktoś na pewno uzna to za przydatne! – noahandthewhale