2013-07-05 10 views
9

Cel: Chcę oddzielić słowa, aby policzyć ich częstotliwość w dokumencie, a następnie wykonać obliczenia na tych częstotliwościach.Regex do pasowania znaków akcentujących

Słowa mogą rozpocząć/zwierają/koniec z jednego z następujących:

  • numerów
  • alfabetów (w tym e, u, ó itd ale nie symboli, takich jak $, #, & etc)

słowa mogą zawierać (ale nie zaczynają lub kończą)

  • podkreślenia (np rishi_dua)
  • apostrof (np: nie można)
  • myślnik (np: 123-)

słów mogą być oddzielone dowolną symbolu lub spacji jak $, #, &, charakter zakładka

problem:

  1. nie jestem w stanie dowiedzieć się, jak dopasować E, U, ó itd bez dopasowania inne znaki specjalne .
  2. Jaki byłby bardziej efektywny sposób to zrobić (opcjonalnie)
  3. rozwarstwieniem przestrzeń pracuje dla mnie w tej chwili, ponieważ nie ma innego

Co próbowałem:

Podejście: Najpierw zastąpić wszystko z wyjątkiem \ w (alfanumeryczny plus "_") 'i - z miejscem Potem usuń', _ i "jeśli okaże się na Begi nning lub koniec słowa końcu zastąpić wielokrotne spacje z pojedynczym odstępem i podzielić słowa

Kod: Używam seria regex zastąpić następująco:

$str =~ s/[^\w'-]/ /g; 
#Also tried using $str =~ s/[^:alpha:0-9_'-]/ /g; but doesn't work 
$str =~ s/-//; 
$str =~ s/'//; 
$str =~ s/_//; 
$str =~ s/ -/ /; 
$str =~ s/ '/ /; 
$str =~ s/ _/ /; 

$str =~ s/ +/ /; 
foreach $word (split(' ', lc $str)) { 
    #do something 
} 

ograniczenia: Muszę to zrobić w Perlu (ponieważ jest to część większego kodu, który napisałem w Perlu), ale mogę korzystać z innych opcji niż Regex

Odpowiedz

12

Możesz użyć \p{L} klasa znaków pasująca do wszystkich liter. i użyj \P{L}, która pasuje do wszystkiego, co nie jest literą.

Aby umożliwić cytat i łącznik można użyć:

\p{L}[\p{L}'_-]*

Aby dopasować separatorów można użyć:

[^\p{L}'_-]+ (do podziału)

Lub dokładniej:

(?>[^\p{L}'_-]+|\B['_-]+|[-_']+\B), które dzielą się na łączniki i cytaty, które również nie są słowem.

+1

@Rishi wziąć również zapoznać się z rozszerzeniami Unicode Perla: http://perldoc.perl.org/perlunicode.html –

+0

@Casimir, ja właśnie wypróbowałem twój kod. To nie działa dla mnie. Jak sugerują Eli Algranti i Jim Monty, myślę, że ma to coś wspólnego z kodowaniem znaków. Przeczytam to –

+0

@Rishi Dua, Jak rozszyfrowałeś swoje wejścia? – ikegami

1

Przeczytaj niezwykle szczegółową odpowiedź na na Why does modern Perl avoid UTF-8 by default?. Krótka odpowiedź na twoje pytanie jest taka, że ​​musisz upewnić się, że poprawnie dekodujesz i kodujesz tekst, i musisz zrozumieć, jak używać wzorców regularnego wyrażania Perla, aby dopasować tekst w Unicode.

+0

Dzięki! Właśnie zauważyłem, że plik perl, którego używam do testowania, a rzeczywisty plik danych, którego używam, jest otwierany przy użyciu innego kodowania w Notepad ++. Jestem początkującym w kodowaniu. Przeczyta te rzeczy. Dzięki :) –

Powiązane problemy