2013-07-05 17 views
9

Mục đích: Tôi muốn tách các từ để đếm tần suất của chúng trong tài liệu và sau đó thực hiện một số phép tính về các tần số đó.Regex cho các ký tự dấu trọng âm

Những lời có thể bắt đầu/chứa/kết thúc với bất kỳ những điều sau đây: số

  • bảng chữ cái (bao gồm é, ú, ó vv nhưng không phải biểu tượng như $, #, & vv)

Những lời có thể chứa (nhưng không bắt đầu hoặc kết thúc với)

  • gạch dưới (ví dụ: rishi_dua)
  • dấu nháy đơn (ví dụ: có thể không)
  • dấu gạch ngang (ví dụ: 123-)

Những lời có thể được ngăn cách bởi bất kỳ biểu tượng hoặc khoảng trắng như $, #, &, ký tự tab

vấn đề:

  1. tôi không thể tìm ra cách để phù hợp với é, ú, ó vv mà không phù hợp với ký tự đặc biệt khác .
  2. Điều gì sẽ là một cách hiệu quả hơn để làm điều này (không bắt buộc )
  3. Splitting bởi không gian đang làm việc cho tôi vào lúc này như không có khác

Những gì tôi đã cố gắng:

Cách tiếp cận: Trước tiên tôi thay thế tất cả mọi thứ trừ \ w (chữ và số cộng "_"), và - với một không gian Sau đó, tôi xóa ', _ và' nếu nó được tìm thấy tại begi nning hoặc cuối của một từ Cuối cùng tôi thay thế nhiều không gian với không gian duy nhất và chia các từ

Code: Tôi đang sử dụng một loạt các regex thay thế như sau:

$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 
} 

ràng buộc: Tôi phải làm điều đó trong Perl (vì đây là một phần của mã lớn hơn tôi đã viết trong Perl) nhưng tôi có thể sử dụng các tùy chọn khác ngoài Regex

Trả lời

12

Bạn có thể sử dụng \p{L} lớp nhân vật phù hợp với tất cả các chữ cái. và sử dụng \P{L} khớp với tất cả những gì không phải là chữ cái.

Để cho phép trích dẫn và dấu nối, bạn có thể sử dụng:

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

Để phù hợp với các thiết bị tách bạn có thể sử dụng:

[^\p{L}'_-]+ (chia)

Hoặc để được chính xác hơn:

(?>[^\p{L}'_-]+|\B['_-]+|[-_']+\B) chia tách dấu gạch nối và dấu ngoặc kép không có trong từ.

+1

@Rishi cũng hãy nhìn vào các phần mở rộng unicode perl: http://perldoc.perl.org/perlunicode.html –

+0

@Casimir, tôi vừa thử mã của bạn. Nó không làm việc cho tôi. Theo đề xuất của Eli Algranti và Jim Monty, tôi đoán nó có liên quan đến mã hóa ký tự. Tôi sẽ đọc nó lên –

+0

@ Rishi Dua, Làm thế nào bạn giải mã được đầu vào của bạn? – ikegami

1

Đọc câu trả lời chi tiết đặc biệt của Tom Christiansen với Why does modern Perl avoid UTF-8 by default?. Câu trả lời ngắn cho câu hỏi của bạn là bạn phải đảm bảo bạn đang giải mã và mã hóa văn bản đúng cách và bạn phải hiểu cách sử dụng các mẫu biểu thức chính quy Perl để khớp với văn bản Unicode.

+0

Cảm ơn! Tôi chỉ nhận thấy rằng các tập tin perl tôi đang sử dụng để thử nghiệm và các tập tin dữ liệu thực tế mà tôi đang sử dụng được mở bằng cách sử dụng mã hóa khác nhau trong Notepad ++. Tôi là một newbie để mã hóa. Sẽ đọc những thứ đó lên. Cảm ơn :) –