2016-06-20 3 views
1

줄리아에서 퍼지 정규식 일치를 수행 할 수있는 방법이 있습니까? 나는이 테스트를하지만, 일치하는 정도 자유롭게 허용하고 Levenshtein 거리하여이를 지정할 수 있도록하고 싶습니다줄리아에서 일치하는 퍼지 정규식

toMatch = Regex(word,"i") 
ismatch(toMatch,input_string) 

:

나는 다음과 같은 정규 표현식 테스트를 건설했다.

거리를 계산할 수있는 Levenshtein 패키지를 발견했지만이를이 논리에 통합하는 방법을 모르겠습니다. 예를 들면 :

levenshtein("hello","hllo")` 
> 1 
+0

여기에 정규식이 필요합니까? 이것은 일반 정규 표현식에 대해 어려운 (계산적으로) 문제가있는 것처럼 들립니다. –

+0

필요하지 않을 수도 있습니다. 먼저 여기에 나열된 코드를 사용하여 정확한 일치를 위해이 문제를 해결했으며 ** input_string ** 내에 맞춤법 오류를 허용하려고했습니다. – Aaron

답변

0

(이 답변은 정규 표현식과 아무 상관이 없지만, 몇 가지 사용 사례를 다루고 있습니다.)

이 사용 사례에 대한 작동하는지 모르겠어요. 그러나 단어 (또는 긴 철자 오류)가 텍스트에 있는지 여부를 찾는 것처럼 보입니다. 대략, 이것이 무엇을

nopunct(s) = filter(c -> !ispunct(c), s) 
nfcl(s) = normalize_string(s, decompose=true, compat=true, casefold=true, 
           stripmark=true, stripignore=true) 
canonicalize(s) = nopunct(nfcl(s)) 
fuzzy(needle, haystack, n) = any(
    w -> levenshtein(w, canonicalize(needle)) < n, 
    split(canonicalize(haystack))) 

: 텍스트가 공백으로 구분되며, 귀하의 단어에 공백이 포함되지 않은 경우, 당신은 뭔가를 시도 할 수

nfcl 비슷한 "인간"모습으로 문자열을 정규화, 악센트를 제거하고, 대소 문자를 무시하고, 유니 코드 정규화를 수행합니다. 이 퍼지 매칭을위한 매우 유용합니다

julia> nfcl("Ce texte est en français.") 
"ce texte est en francais." 

nopunct 추가 문자열을 단순화, 문장 부호를 제거합니다.

julia> nopunct("Hello, World!") 
"Hello World" 

canonicalize은 단순히이 두 변환을 결합합니다.

그런 다음 건초 더미의 단어 중 아무 것도 바늘의 n 내에 있는지 확인합니다.

예 :

julia> fuzzy("Robert", "My name is robrt.", 2) 
true 

julia> fuzzy("Robert", "My name is john.", 2) 
false 

이 결코 완벽한 솔루션을 의미하는 것입니다,하지만 그것은 일반적인 사용 사례를 많이 다루고 있습니다. 고급 사용 사례를 보려면 the subject을 자세히 살펴야합니다.

+0

그러나이 경우 매우 유용합니다. 필자의 경우 텍스트에서 찾으려는 단어에 문구가 될 수 있으므로 공백이있을 수 있습니다. 이것을 수정할 수 있다고 제안 할 수있는 수정이 있습니까? – Aaron

+0

@Aaron 바늘이 일반 오래된 문자열 ('*'또는'()'과 같은 정규식 문자가 아닌 경우) 할 수있는 "속임수"가 있습니다 :'levenshtein (needle, haystack)'을 계산하고 그것이 맞는지 확인하십시오 길이 (건초 더미) - 길이 (바늘) + n'보다 작습니다. (건초 더미에서 바늘로 이동하기 위해서는 적어도 '길이 (건초 더미) - 길이 (바늘)'문자를 지워야하고 이후에는'n'까지 추가 조작을해야합니다.) 이것은 바늘에있는 문자와 관계없이 작동합니다. –

+0

이것이 내 요구 사항에 매우 잘 맞을 것이라고 생각합니다. 내가 추가 할 한가지 수정은 '바늘의 길이'의 함수로서'n'을 약간 변경하는 것입니다. – Aaron