Gadaffi를 검색하는 정규식


361

가다피 (Gadaffi)라는 단어를 검색하려고합니다. 이것을 검색하는 가장 좋은 정규식은 무엇입니까?

지금까지 최선의 시도는 다음과 같습니다.

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

그러나 여전히 일부 저널이 누락 된 것 같습니다. 어떤 제안?

업데이트 : 나는 여기에서 꽤 광범위한 목록을 찾았습니다 : http://blogs.abcnews.com/theworldnewser/2009/09/how-many-different-ways-can-you-spell-gaddafi.html

아래의 답변은 30 가지 변형과 모두 일치합니다.

가다피
가다피
가다피
가다피
가다피
가다피
가다피
가타 피
가다피
가다피
가다피
가다피
게다 피
카다피
카다피
카다피
카다피
카자 피
카다피
카다피
카다피
카다피
카다피
카다피
카다피
카다피
카타 피
콰 타피
꾸다 피
카다피

8
어느 것이 빠졌습니까? 그리고 어디에서 검색하고 있습니까, 정규식으로 웹 검색이 있습니까?
Czechnology

43
항상 새로운 저널이 출판되기 때문에 가다피에 대해 계속 글을 쓰는다면 .+유일하게 유효한 정규 표현식이 될 것입니다.
moinudin

30
이 사진이 다른 철자를 쓰는 데 도움이된다는 것을 알았습니다. upload.wikimedia.org/math/6/1/f/…
KLee1

24
평소와 같이 Lisp는이 첫 번째 foldr.org/~michaelw/projects/regex/regexp-test-suite.lisp (반쯤 스크롤)
Daniel S. Sterling

7
@Daniel Sterling : 실제로 Khadafy 테스트는 RCS에 대한 초기 커밋 이후 (GNU 11 월 3 일 21:38:52 1998 +0000) GNU grep 테스트 스위트의 일부이며 아마도 그보다 더 오래된 것입니다!
Paolo Bonzini

답변:


138

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

아랍어 전사는 (Wiki에 따르면) "Qaḏḏāfī"이므로 Q를 추가하고 H를 추가 할 수 있습니다 (아래 기사 참조).

Btw, $정규식 끝에 왜 있습니까?


Btw, 주제에 대한 좋은 기사 :

Gaddafi, Kadafi 또는 Qaddafi? 리비아 지도자의 이름이 왜 그렇게 많은 다른 철자로 쓰입니까? .


편집하다

나중에 언급 한 기사의 모든 이름과 일치하려면 모두 일치해야합니다. 그것이 다른 많은 것들과 일치하지 않기를 바랍니다 : D

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

$가 잘못되었습니다. 먼저 줄 끝을 일치시키고 제거하는 것을 잊었습니다.
SiggyF

dḏ 와도 일치 합니까 ?
SiggyF

2
@DiggyF, 아니오, 아랍어 전사가이라고 Qaḏḏāfī하면 정규식 Qaddafi도 확인해야 한다고 생각했습니다 . 아랍어 전사를 찾고 싶다면 그 중 하나만 검색하십시오. 아랍어 전사의 변형이 더 많지 않고 영어 전사 만 있다고 생각합니다.
체코 학 03. 19. 22.

@DiggyF, 나는 당신이 게시 한 기사의 모든 이름과 일치하는 더 긴 정규 표현식으로 편집했습니다 ( ?문자 대신 두 글자 제외 ). 그래도 과잉 일 수 있습니다.
Czechnology

2
이것은 또한 'Quuzzafi'및 기타 여러 오탐과 일치하지만 뉴스 보고서 등을 통해 검색 할 때별로 중요하지 않다고 생각합니다.
ben w

275

쉬운 ... (Qadaffi|Khadafy|Qadafi|... )... 자체 문서화되고 유지 관리가 가능하며 정규 표현식 엔진이 실제로 정규 표현식을 해석하지 않고 컴파일한다고 가정하면 더 난해한 솔루션과 동일한 DFA로 컴파일됩니다.

간단한 정규식을 작성하는 것은 짧은 변수 이름을 사용하여 프로그램 속도를 높이는 것과 같습니다. 컴파일러가 죽어있는 경우에만 도움이됩니다.


23
좋은 답변입니다! 사람들은 실제 작업 방식에 관심이있는 것보다 훨씬 자주 정규식을 사용합니다.
Thomas Ahle

3
이 솔루션의 단순성도 정말 마음에 들지만 이것이 동일한 DFA로 컴파일되는 것에 놀랐습니다. 이것에 대해 이야기하는 링크가 있습니까? 직관적으로 이것은 이전에 제작 된 정규 표현식 또는 아래의 대답보다 효율이 떨어질 것 같습니다.
리안 샌더슨

6
정규 표현식의 요점은이 경우와 같이 상대적으로 짧은 공식에 대한 매우 긴 대안 목록을 종종 줄이는 것입니다. 본질적으로 최적화되지 않은 철저한 검색을 수행하는 것보다 결과가 더 빨리 실행될 수 있습니다.
martineau

7
당신은 맞습니다. 정규 표현식의 요점은 큰 값 집합에 대해 작고 명확한 표현을 제공하는 것입니다. 그러나 기본 개념은 정규 표현식을 제시하고 "이와 일치하는 것은 좋습니다"라고 말하는 것입니다. 즉, 체계적인 것을 자유롭게 포함 할 수 있다고 가정합니다. 여기에는 반대 상황이 있습니다. 변형 철자 (및 전혀 나타나지 않는 변형)는 '완전히 임의적 인'측면이 아닙니다. "소형"에 대한 정교한 시도는 "명확한"에 대해 매우 낮은 점수를받습니다!
jackr

1
또한 문자열 검색에 최적 인 Aho-Corasick 알고리즘도 확인하십시오. en.wikipedia.org/wiki/…
Thomas Ahle

45

잠재적 인 철자 목록에서 주목해야 할 흥미로운 점은 포함 된 목록에 대해 3 개의 Soundex 값만 있다는 것입니다 (이상치 'Kazzafi'를 무시하는 경우).

G310, K310, Q310

이제 거기에는 오 탐지 ( 'Godby'도 G310 임)가 있지만 제한된 메타 폰 적중도 결합하면 제거 할 수 있습니다.

<?
$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;
?>

약간의 조정과 약간의 키릴 음역을 말하면 상당히 강력한 해결책이 있습니다.


2
soundex는 영어에 특화되어 있으며 다른 발음 규칙을 가진 다른 언어에 대한 다른 음성 알고리즘이 있습니다
시크릿

8
이것이 사실이지만, 우리는 여기서 이상한 상황에 처해 있습니다. 기본 요청은 "가디 피 (Gadaffi)"라는 단어를 찾으려고했지만 정규식이 붉은 청어 인 것 같습니다. 아랍어-> 라틴 음역에 관한 규칙은 없으며, 목록에서 정규 표현식을 되 돌리면 원래 요청에 완전히 응답하지 않습니다.
tomwalsham

2
퍼지 매칭 시스템이 더 적합하다고 생각하지만 사용자 정의 알고리즘이 과도하게 보입니다. soundex-metaphone 콤보를 사용하면 정규식 솔루션뿐만 아니라 성능도 뛰어 나기 때문에 예상치 못한 철자를 계속 사용하면서도 예상치 못한 철자를 더 사용할 수 있습니다.
tomwalsham

metaphone2와 metaphone3을 사용하면 더 나은 결과를 얻을 수 있습니다 (즉, metaphone1과 달리 metaphone2의 거의 모든 것이 KDF입니다). 그러나 Metaphone3의 비용은 약 40 달러입니다.
시크릿

27

CPAN 모듈 Regexp :: Assemble 사용 :

#!/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;

다음과 같은 정규식이 생성됩니다.

(?-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

나는 당신이 여기에서 일을 복잡하게하고 있다고 생각합니다. 올바른 정규 표현식은 다음과 같이 간단합니다.

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

이 단어는 단어 القذافي (즉, Gadaffi)를 형성하는 7 개의 아랍어 유니 코드 코드 포인트의 연결과 일치합니다.


3
다음으로 Google Translate와 Bob의 삼촌을 통해 nytimes.com을 파이프하십시오.
Robert Rossney

19

아무도 사용하지 않은 것을 일치시키지 않으려면 (예 : ". +"로 향하는 경향을 피하십시오) 가장 좋은 방법은 모든 대안 (예 : (Qadafi | Kadafi | ...) 인 정규식을 만드는 것입니다. ) 그런 다음 DFA로 컴파일 한 다음 DFA를 다시 정규식으로 변환합니다. 예상치 못한 변형을 포함하지 않는 "압축 된"정규식을 제공하는 적당히 합리적인 구현을 가정합니다.


2
나는 그것이 가능하다는 것을 알고 있지만 실제로는 어떻게해야할까요 (예를 들어 솜 일반적인 동적 언어 사용)
Rory

3
나는 이것의 배후 이론을 이해하지만 @Rory와 마찬가지로 실제로 실제로 어떻게 수행하는지 알고 싶습니다.
dancavallaro

그래, 나는 그것에 대해 더 나은 대답을하기 위해 그것을 생각했지만 지금은 조금 바쁘다. code.google.com/p/lepl/source/browse/src/lepl/regexp/core.py에 일부 (추악하고 잘못 문서화 된) 코드 가 있는데 정규 표현식에서 dfa를 생성합니다 (실제로 파서는 다른 클래스에 있습니다. 그러나 열심히 일하고 있습니다; regexp-> nfa-> dfa). dfa에서 정규 표현식으로가는 것은 쉽습니다 (생각합니까?).
앤드류 쿡

실제로, 내가 기억하는 것보다 더 나은 문서가 있습니다 : o) 기본 아이디어는 정규 표현식을 파일 상단 근처의 클래스로 설명한다는 것입니다. 그런 다음 상당히 쉽게 nfa로 번역 될 수 있습니다 (nfa는 실제로 "이 편지를 받으면 여기 또는 여기로 갈 수있는 것보다 ..."이라고 말하는 일련의 전환입니다). dfa는 역 추적을 피하면서 "확장 된"버전의 일종입니다. 그것은 NfaToDfa에 의해 이루어집니다 (그리고 어려운 부분입니다). dfa는 매우 복잡한 문자 집합 (?!)으로
작성된

10

30 가지 가능성에 대한 구체적인 목록을 가지고 있다면, "or"와 함께 모두 연결하십시오. 그런 다음이 될 수 있는지 그것은 단지 당신이 열거 한 정확한 것들과 일치하고, 더 이상있다. RE 엔진은 아마도 그다지 중요하지 않더라도 30 가지 선택으로 더 최적화 할 수있을 것입니다. 수동으로 "영리한"RE로 바꾸면서 장난을 치면 더 나아질 수 없으며 나빠질 수 있습니다.


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)

확실히 가장 최적화 된 버전은 아니지만 음절로 분할하여 일치를 최대화하면서 오 탐지를 얻지 않도록합니다.


7

작은 단어와 일치하기 때문에 왜 Levenshtein 거리 와 유사 검색 엔진을 사용 하지 않습니까? 최대 k 개의 삽입 또는 삭제를 허용 할 수 있습니다 . 이렇게하면 거리 기능을 특정 문제에 더 적합한 다른 것으로 변경할 수 있습니다. simMetrics 라이브러리에는 많은 기능이 있습니다.



1

왜 혼합 된 접근 방식을 사용하지 않습니까? 모든 가능성의 목록과 너무 많은 일치하는 복잡한 Regex 사이의 무언가.

정규식은 패턴 일치에 관한 것이며 목록의 모든 변형에 대한 패턴을 볼 수 없습니다. 그렇게하려고하면 "Gazzafy"또는 "Quud'haffi"와 같이 아마도 사용 된 변형이 아니며 목록에없는 것도 발견 될 것입니다.

그러나 일부 변형에 대한 패턴을 볼 수 있으므로 결과는 다음과 같습니다.

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

처음에는 패턴을 볼 수없는 패턴을 나열한 다음 패턴이있는 변형을 나열합니다.

www.rubular.com 에서 여기를 참조하십시오


귀하 \b는 첫 번째 및 마지막 대안에만 포함됩니다.
Christopher Creutzig

1

나는 이것이 오래된 질문이라는 것을 알고 있지만 ...

이 두 정규식 중 어느 것도 가장 예쁘지는 않지만 최적화 되어 있으며 원래 게시물의 모든 변형 과 일치 합니다.

"작은 아름다움"# 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)

"작은 아름다움"# 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

Muammar, 평화롭게 쉬십시오.



0

[GQK] [아후] + [dtez] + \ '? [adhz] + f {1,2} (i | y)

부분적으로 :

  • [GQK]
  • [아후] +
  • [dtez] +
  • \ '?
  • [adhz] +
  • f {1,2} (i | y)

참고 : 이것에 총을 겨냥했습니다.


-1

Q, G 또는 K로 시작하여 광고, z 또는 t가 중간에 있고 사람들이 실제로 검색 하는 "fi"로 끝나는 것은 무엇입니까?

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

끝난.

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

내가 관심을 끌고 있다는 것이 흥미 롭습니다. 누군가 의견에 거짓 긍정을 남길 수 있습니까?


2
내가 앉아있는 크래킹 사전에서 : 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 . 그러나 그 중 일부는 탐지 가 아닙니다 .
BMDan

2
그리고 그 목록에 추가 된 [iy]igelatinify gentrify ghostlify giddify gladify goutify gratify "Gyula Dessewffy" katasrofy katastrofy khadafy quantify quasi-deify quizzify
것들은
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.