Biểu thức chính quy để tìm kiếm Gadaffi


361

Tôi đang cố gắng tìm kiếm từ Gadaffi. Biểu thức chính quy tốt nhất để tìm kiếm này là gì?

Nỗ lực tốt nhất của tôi cho đến nay là:

\b[KG]h?add?af?fi$\b

Nhưng tôi dường như vẫn còn thiếu một số tạp chí. Bất kỳ đề xuất?

Cập nhật: Tôi tìm thấy một danh sách khá rộng ở đây: http://blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

Câu trả lời dưới đây phù hợp với tất cả 30 biến thể:

Gadaffi
Gadafi
Tiện ích
Gaddafi
Gaddafy
Gaddhafi
Gadhafi
Gathafi
Ghadaffi
Ghadafi
Ghaddafi
Ghaddafy
Gheddafi
Kadaffi
Kadafi
Kaddafi
Kuhafi
Kazzafi
Khadaffy
Khadafy
Khaddafi
Qadafi
Qaddafi
Qalafafi
Qadhdhafi
Qadthafi
Qathafi
Quathafi
Qudhafi
Kad'afi

8
Những cái nào bạn đang thiếu? Và bạn đang tìm kiếm ở đâu, có tìm kiếm trên web với regex không?
Công nghệ

43
Luôn có những tạp chí mới được xuất bản, vì vậy nếu họ tiếp tục viết về Gadaffi, bạn sẽ có xu hướng .+trở thành biểu thức chính quy duy nhất hợp lệ.
moinudin

30
Tôi thấy rằng hình ảnh này giúp với các cách viết khác nhau: tải lên.wik mega.org/math/6/1/f/NH
KLee1

24
Như thường lệ, Lisp đã triển khai việc này trước tiên - Foldr.org/~michaelw/projects/regex/regapid-test-suite.lisp (cuộn xuống một nửa)
Daniel S. Sterling

7
@Daniel Sterling: thực ra, bài kiểm tra Khadafy là một phần của bài kiểm tra GNU grep kể từ khi cam kết ban đầu với RCS (Thứ ba ngày 3 tháng 11 21:38:52 1998 +0000), và thậm chí còn cũ hơn thế!
Paolo Bonzini

Câu trả lời:


138

\b[KGQ]h?add?h?af?fi\b

Phiên âm tiếng Ả Rập là (Wiki nói) "Qaḏḏāfī", vì vậy có thể thêm một Q. Và một H ("Gadhafi", như bài viết (xem bên dưới) đề cập).

Btw, tại sao có một $kết thúc của regex?


Btw, bài viết hay về chủ đề này:

Gaddafi, Kadafi hay Qaddafi? Tại sao tên của người dẫn đầu Libya được đánh vần theo nhiều cách khác nhau? .


BIÊN TẬP

Để khớp với tất cả các tên trong bài viết bạn đã đề cập sau này , điều này phải phù hợp với tất cả chúng. Hãy hy vọng nó sẽ không phù hợp với nhiều thứ khác: D

\b(Kh?|Gh?|Qu?)[aeu](d['dt]?|t|zz|dhd)h?aff?[iy]\b

$ Là sai, tôi đã khớp cuối dòng, quên xóa nó.
SiggyF

Không dcòn phù hợp với một d?
SiggyF

2
@DiggyF, không, tôi chỉ nghĩ rằng nếu phiên âm tiếng Ả Rập nói Qaḏḏāfī, regex cũng nên kiểm tra Qaddafi. Nếu bạn cũng muốn tìm phiên âm tiếng Ả Rập, chỉ cần tìm từ đó - tôi không nghĩ có nhiều biến thể của phiên âm tiếng Ả Rập, chỉ có phiên âm tiếng Anh.
Công nghệ

@DiggyF, tôi đã chỉnh sửa trong một regex dài hơn phù hợp với tất cả các tên trong bài viết bạn đã đăng (ngoại trừ hai tên ?thay vì chữ cái). Có thể là một quá mức cần thiết mặc dù.
Công nghệ

2
Điều này cũng phù hợp với 'Quuzzafi' và một loạt các tích cực sai khác, mặc dù tôi cho rằng trong việc tìm kiếm thông qua các báo cáo tin tức, vv sẽ không quan trọng lắm.
ben w

275

Dễ dàng ... (Qadaffi|Khadafy|Qadafi|... )... nó tự ghi lại, có thể duy trì và giả sử công cụ regrec của bạn thực sự biên dịch các biểu thức chính quy (thay vì diễn giải chúng), nó sẽ biên dịch theo cùng một DFA mà một giải pháp khó hiểu hơn sẽ làm.

Viết biểu thức chính quy nhỏ gọn giống như sử dụng tên biến ngắn để tăng tốc chương trình. Nó chỉ giúp nếu trình biên dịch của bạn bị chết não.


23
Câu trả lời chính xác! Mọi người sử dụng các biểu thức chính quy thường xuyên hơn nhiều so với việc họ quan tâm đến cách họ thực sự làm việc.
Thomas Ahle

3
Tôi thực sự thích sự đơn giản của giải pháp này, nhưng tôi ngạc nhiên rằng nó sẽ được biên dịch theo cùng một DFA. Bạn có một liên kết nói về điều này? Theo trực giác, điều này có vẻ như có thể kém hiệu quả hơn so với regex được tạo trước đó hoặc câu trả lời dưới đây gợi ý sử dụng mô-đun Regapi :: Assemble perl trên cùng một danh sách tên or'd.
Rian Sanderson

6
-1 Toàn bộ quan điểm của một biểu thức chính là giảm những gì thường có thể xảy ra - như trong trường hợp này - một danh sách rất dài các lựa chọn thay thế cho công thức tương đối ngắn. Kết quả thường có thể thực hiện nhanh hơn so với thực hiện những gì về cơ bản là một tìm kiếm toàn diện không được tối ưu hóa.
martineau

7
Bạn nói đúng, quan điểm của regexes là cung cấp một biểu diễn nhỏ gọn, rõ ràng cho một tập hợp lớn các giá trị. Nhưng khái niệm cơ bản là trình bày một regex và nói "bất cứ điều gì phù hợp với điều này là tốt." Đó là, nó giả định rằng bạn có quyền tự do bao gồm mọi thứ có hệ thống. Ở đây, chúng ta có một tình huống ngược lại: các cách viết biến thể (và các biến thể không bao giờ xuất hiện) chỉ nằm ở phía bên này của 'hoàn toàn ngẫu nhiên'. Những nỗ lực công phu tại "nhỏ gọn" nhận được điểm rất thấp cho "rõ ràng"!
jackr

1
Ngoài ra, hãy kiểm tra thuật toán Aho-Corasick, tối ưu cho việc tìm kiếm chuỗi đồng thời: en.wikipedia.org/wiki/ Kẻ
Thomas Ahle

45

Một điều thú vị cần lưu ý từ danh sách các cách viết tiềm năng của bạn là chỉ có 3 giá trị Soundex cho danh sách được chứa (nếu bạn bỏ qua 'Kazzafi' ngoại lệ)

G310, K 310, Q310

Bây giờ, có những điểm tích cực giả trong đó ('Godby' cũng là G310), nhưng bằng cách kết hợp các lần truy cập metaphone hạn chế, bạn có thể loại bỏ chúng.

<?
$soundexMatch = array('G310','K310','Q310');
$metaphoneMatch = array('KTF','KTHF','FTF','KHTF','K0F');

$text = "This is a big glob of text about Mr. Gaddafi. Even using compound-Khadafy terms in here, then we might find Mr Qudhafi to be matched fairly well. For example even with apostrophes sprinkled randomly like in Kad'afi, you won't find false positives matched like godfrey, or godby, or even kabbadi";

$wordArray = preg_split('/[\s,.;-]+/',$text);
foreach ($wordArray as $item){
    $rate = in_array(soundex($item),$soundexMatch) + in_array(metaphone($item),$metaphoneMatch);
    if ($rate > 1){
        $matches[] = $item;
    }
}
$pattern = implode("|",$matches);
$text = preg_replace("/($pattern)/","<b>$1</b>",$text);
echo $text;
?>

Một vài điều chỉnh và cho phép một số phiên âm cyrillic, và bạn sẽ có một giải pháp khá mạnh mẽ.


2
Xin lưu ý, soundex chuyên về tiếng Anh, có tồn tại các thuật toán ngữ âm khác cho các ngôn ngữ khác với các quy tắc phát âm khác nhau
Ẩn danh

8
Trong khi điều này là đúng, chúng ta đang ở trong một tình huống kỳ lạ ở đây. Yêu cầu chính là "Tôi đang cố gắng tìm kiếm từ Gadaffi", nhưng tôi cảm thấy regex là một cá trích đỏ. Không có quy tắc về phiên âm tiếng Ả Rập-> tiếng Latin và vì vậy việc đảo ngược một biểu thức chính quy từ danh sách sẽ không trả lời đầy đủ yêu cầu ban đầu.
tomwalsham

2
Tôi cảm thấy một hệ thống kết hợp mờ phù hợp hơn, nhưng một thuật toán tùy chỉnh có vẻ quá mức cần thiết. Sử dụng kết hợp soundex-metaphone dường như cũng có hiệu quả như giải pháp regex, cho phép sử dụng các cách viết không dự đoán thêm trong khi vẫn chỉ sử dụng các thuật toán ngoài lề.
tomwalsham

Việc sử dụng metaphone2 và metaphone3 dẫn đến kết quả tốt hơn (nghĩa là hầu hết mọi thứ trong metaphone2 là KDF, trong đó như metaphone1 không hoàn toàn). Metaphone3 tuy nhiên, chi phí khoảng 40 đô la.
Ẩn danh

27

Sử dụng mô-đun CPAN Regapi :: Lắp ráp :

#!/usr/bin/env perl

use Regexp::Assemble;

my $ra = Regexp::Assemble->new;
$ra->add($_) for qw(Gadaffi Gadafi Gadafy Gaddafi Gaddafy
                    Gaddhafi Gadhafi Gathafi Ghadaffi Ghadafi
                    Ghaddafi Ghaddafy Gheddafi Kadaffi Kadafi
                    Kaddafi Kadhafi Kazzafi Khadaffy Khadafy
                    Khaddafi Qadafi Qaddafi Qadhafi Qadhdhafi
                    Qadthafi Qathafi Quathafi Qudhafi Kad'afi);
say $ra->re;

Điều này tạo ra biểu thức chính quy sau:

(?-xism:(?:G(?:a(?:d(?:d(?:af[iy]|hafi)|af(?:f?i|y)|hafi)|thafi)|h(?:ad(?:daf[iy]|af?fi)|eddafi))|K(?:a(?:d(?:['dh]a|af?)|zza)fi|had(?:af?fy|dafi))|Q(?:a(?:d(?:(?:(?:hd)?|t)h|d)?|th)|u(?:at|d)h)afi))

23

Tôi nghĩ rằng bạn đang làm phức tạp mọi thứ ở đây. Regex đúng là đơn giản như:

\u0627\u0644\u0642\u0630\u0627\u0641\u064a

Nó phù hợp với cách ghép của bảy điểm mã Unicode tiếng Ả Rập tạo thành từ tiếng Ả Rập (tức là Gadaffi).


3
Tiếp theo, chỉ cần dẫn nytimes.com thông qua Google Dịch và Bob là chú của bạn.
Robert Rossney

19

Nếu bạn muốn tránh kết hợp những thứ mà không ai đã sử dụng (nghĩa là tránh xu hướng ". +") Cách tiếp cận tốt nhất của bạn sẽ là tạo một biểu thức chính quy chỉ là tất cả các lựa chọn thay thế (ví dụ: (Qadafi | Kadafi | ...) ) sau đó biên dịch nó thành DFA và sau đó chuyển đổi DFA trở lại thành biểu thức chính quy. Giả sử một triển khai hợp lý vừa phải sẽ cung cấp cho bạn một biểu thức chính quy "nén" được đảm bảo không chứa các biến thể không mong muốn.


2
Tôi biết rằng điều đó là có thể về mặt trị liệu, nhưng làm thế nào bạn sẽ làm điều đó trong thực tế (ví dụ sử dụng ngôn ngữ động thông thường nào đó)
Rory

3
Tôi hiểu lý thuyết đằng sau điều này, nhưng cũng như @Rory, tôi cũng muốn biết làm thế nào bạn thực sự làm điều này trong thực tế.
dancavallaro

Vâng, tôi nghĩ về việc làm nó, để đưa ra một câu trả lời tốt hơn, nhưng hiện tại tôi hơi bận rộn. Tôi có một số mã (tài liệu xấu và kém) tại code.google.com/p/lepl/source/browse/src/lepl/regapid/core.py xây dựng một dfa từ regrec (thực ra, trình phân tích cú pháp nằm trong một lớp khác , nhưng công việc khó khăn là ở đó, bạn đi regrec -> nfa -> dfa). đi từ dfa đến regrec thật dễ dàng (tôi nghĩ sao?).
andrew cooke

trên thực tế, tài liệu ở đó tốt hơn tôi nhớ: o) ý tưởng cơ bản là bạn mô tả biểu thức chính quy về các lớp gần đầu tệp. sau đó có thể được dịch sang một nfa khá dễ dàng (một nfa thực sự chỉ là một tập hợp chuyển tiếp với nội dung "nếu bạn nhận được thư này hơn bạn có thể đến đây hoặc ở đây ..." điều đó khá dễ hiểu). dfa sau đó là một loại phiên bản "mở rộng" mà bạn giữ để tránh phải quay lại; điều đó được thực hiện bởi NfaToDfa (và là phần khó). dfa sau đó có thể mặc dù là một regrec chính nó được viết là bộ ký tự rất phức tạp (?!)
thu hút

10

Nếu bạn đã có một danh sách cụ thể của tất cả 30 khả năng, chỉ cần ghép tất cả chúng lại với nhau bằng một loạt "ors". Sau đó, bạn có thể chắc chắn rằng nó chỉ phù hợp với những điều chính xác bạn đã liệt kê, và không còn nữa. Công cụ RE của bạn có thể sẽ có thể tối ưu hóa hơn nữa, và, với 30 lựa chọn ngay cả khi nó không phải là một vấn đề lớn. Cố gắng nghịch ngợm bằng cách biến nó thành một "thông minh" RE không thể trở nên tốt hơn và có thể trở nên tồi tệ hơn.


9
(G|Gh|K|Kh|Q|Qh|Q|Qu)(a|au|e|u)(dh|zz|th|d|dd)(dh|th|a|ha|)(\x27|)(a|)(ff|f)(i|y)

Chắc chắn không phải là phiên bản được tối ưu hóa nhất, phân chia theo âm tiết để tối đa hóa các trận đấu trong khi cố gắng đảm bảo chúng tôi không nhận được thông báo sai.


7

Chà, vì bạn đang kết hợp các từ nhỏ, tại sao bạn không thử một công cụ tìm kiếm tương tự với khoảng cách Levenshtein ? Bạn có thể cho phép tối đa k chèn hoặc xóa. Bằng cách này, bạn có thể thay đổi chức năng khoảng cách thành những thứ khác hoạt động tốt hơn cho vấn đề cụ thể của bạn. Có nhiều chức năng có sẵn trong thư viện simMetrics.



1

Tại sao không làm một cách tiếp cận hỗn hợp? Một cái gì đó giữa một danh sách tất cả các khả năng và một Regex phức tạp phù hợp với quá nhiều.

Regex là về khớp mẫu và tôi không thể thấy mẫu cho tất cả các biến thể trong danh sách. Cố gắng làm như vậy, cũng sẽ tìm thấy những thứ như "Gazzafy" hoặc "Quud'haffi" có lẽ không phải là một biến thể được sử dụng và chắc chắn không có trong danh sách.

Nhưng tôi có thể thấy các mẫu cho một số biến thể, và vì vậy tôi đã kết thúc với điều này:

\b(?:Gheddafi|Gathafi|Kazzafi|Kad'afi|Qadhdhafi|Qadthafi|Qudhafi|Qu?athafi|[KG]h?add?h?aff?[iy]|Qad[dh]?afi)\b

Lúc đầu, tôi liệt kê những cái mà tôi không thể nhìn thấy một mẫu, sau đó là một số biến thể có các mẫu.

Xem nó ở đây trên www.rubular.com


Của bạn \bchỉ được bao gồm trong các lựa chọn đầu tiên và cuối cùng.
Christopher Creutzig

1

Tôi biết đây là một câu hỏi cũ, nhưng ...

Cả hai regex này đều không đẹp nhất, nhưng chúng được tối ưu hóa và cả hai đều khớp với TẤT CẢ các biến thể trong bài viết gốc.

"Người đẹp nhỏ" # 1

(?:G(?:a(?:d(?:d(?:af[iy]|hafi)|af(?:f?i|y)|hafi)|thafi)|h(?:ad(?:daf[iy]|af?fi)|eddafi))|K(?:a(?:d(?:['dh]a|af?)|zza)fi|had(?:af?fy|dafi))|Q(?:a(?:d(?:(?:(?:hd)?|t)h|d)?|th)|u(?:at|d)h)afi)

"Người đẹp nhỏ" # 2

(?:(?:Gh|[GK])adaff|(?:(?:Gh|[GKQ])ad|(?:Ghe|(?:[GK]h|[GKQ])a)dd|(?:Gadd|(?:[GKQ]a|Q(?:adh|u))d|(?:Qad|(?:Qu|[GQ])a)t)h|Ka(?:zz|d'))af)i|(?:Khadaff|(?:(?:Kh|G)ad|Gh?add)af)y

Nghỉ ngơi trong hòa bình, Muammar.


0

Chỉ là một phụ lục: bạn nên thêm "Gheddafi" dưới dạng chính tả thay thế. Vì vậy, RE nên

\b[KG]h?[ae]dd?af?fi$\b

0

[GQK] [ahu] + [dtez] + \ '? [Adhz] + f {1,2} (i | y)

Trong các bộ phận:

  • [GQK]
  • [ahu] +
  • [dtez] +
  • \ '?
  • [quảng cáo] +
  • f {1,2} (i | y)

Lưu ý: Chỉ muốn đưa ra một cú đánh vào đây.


-1

Những gì khác bắt đầu với Q, G hoặc K, có quảng cáo, z hoặc t ở giữa và kết thúc bằng "fi" những người thực sự tìm kiếm?

/\b[GQK].+[dzt].+fi\b/i

Làm xong.

>>> print re.search(a, "Gadasadasfiasdas") != None
False
>>> print re.search(a, "Gadasadasfi") != None
True
>>> print re.search(a, "Qa'dafi") != None
True

Thật thú vị khi tôi bị hạ bệ. Ai đó có thể để lại một số tích cực sai trong các ý kiến?


2
Từ một từ điển bẻ khóa mà tôi tình cờ đã ngồi xung quanh : kartografi kryptografi Gaddafi Qaddafi gadafi gaddafi katastloofi katastorfi katastrofi khadaffi kadafi kardiyografi gaskromatografi kardiografi kinematografi kromatografi krystallografi kulturgeografi gandolfi grizzaffi gadhafi kadaffi kaddafi khaddafi qaddafi qadhafi quedaffi gordonsCHsKFI . Tuy nhiên, một số trong số đó không phải là dương tính giả .
BMDan

2
Và các bổ sung vào danh sách đó là kết quả của việc kết thúc [iy]thay vì chỉ i:gelatinify gentrify ghostlify giddify gladify goutify gratify "Gyula Dessewffy" katasrofy katastrofy khadafy quantify quasi-deify quizzify
BMDan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.