2011-04-15 16 views
7

Ruby 정규식과 Python 정규식 간에는 실제 차이점이 있습니까?Ruby Regex vs Python Regex

두 항목의 차이점을 찾을 수 없지만 놓친 항목이있을 수 있습니다.

+0

흠? 당신은 무엇을 "찾으려고"하고 있습니까? 정규 표현식 자체는 언어이므로 라이브러리에는 약간 다른 플래그가있을 수 있지만 전반적으로 구문을 지원하는 모든 언어에서 동일합니다. – OneOfOne

+1

Ruby1.8 또는 Ruby1.9? 거기에 큰 차이가 있습니다. – sawa

+3

참고 - http://www.regular-expressions.info/refflavors.html – YOU

답변

6

내가 마지막으로 확인했을 때, 유니 코드 지원이 크게 달랐습니다. 1.9의 루비는 적어도 매우 제한된 유니 코드를 지원합니다. 하나 또는 두 개의 유니 코드 속성이 현재 지원 될 수 있다고 생각합니다. 아마도 일반적인 범주와 스크립트는 내가 생각하는 두 가지 일 것입니다.

파이썬은 점점 더 많은 유니 코드 지원을 동시에 제공합니다. 파이썬은 Unicode Regular Expressions에서 UTS # 18의 RL1.2a "Compatability Properties"의 요구 사항을 충족시킬 수있는 것으로 보입니다.

그런데 Matthew Barnett (mrab)이 실제로 파이썬 정규 표현식에 몇 가지 유니 코드 속성을 추가 한 멋진 파이썬 라이브러리가 있습니다. 그는 가장 중요한 두 가지 항목, 즉 일반 범주 및 스크립트 속성을 지원합니다. 그것은 다른 흥미로운 특징들을 가지고 있습니다. 그것은 좋은 홍보를받을 가치가있다.

루비 또는 파이썬 중 어느 하나가 유니 코드를 아주 잘 지원한다고 생각하지 않지만 매일 점점 더 많이 이루어집니다. 그러나 특히 위의 인용 된 유니 코드 정규 표현식에 대한 베어 본 레벨 1 요구 사항조차 충족시키지 못합니다. 예를 들어, RL1.2는 적어도 11 개의 속성 (General_Category, Script, Alphabetic, Uppercase, Lowercase, White_Space, Noncharacter_Code_Point, Default_Ignorable_Code_Point, ANY, ASCII,ASSIGNED)이 지원되어야합니다.

필자는 파이썬에서만 그 중 일부에 도달 할 수 있다고 생각합니다. 물론이 외에도 많은 다른 많은 속성이 있습니다.

유니 코드 지원을 원할 때 정규 표현식에 대한 UTS # 10 이상이 있습니다. 물론이 점이 가장 중요합니다. 루비 나 퓨이 썬은 레벨 1을 준수하지 않는다. 유니 코드의 다른 중요한 요소로는 UAX # 15, UAX # 14, UTS # 18, UAX # 11, UAX # 29, 물론 UAX # 44가 있습니다. 파이썬에는 적어도 두 개 이상의 라이브러리가 있습니다. 나는 그것이 그들이 표준인지 모른다.

정규 표현식 지원에 관한 한, 두 가지보다 더 풍부한 대안입니다. :)

+0

루비 정규식 지원은 마지막으로 확인한 이후로 훨씬 강력 해졌다고 생각합니다. https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc – steenslag

+0

@steenslag 아니요, 루비 정규 표현식은 여전히 ​​유니 코드를 안고 있습니다. Charclass 약어는 여전히 작년의 아스키 샌드에 붙어있는 RL1.2a와는 거리가 멀다. POSIX 소품과 동일합니다. 그리고'\ p {lower} '같은 것들은 유니 코드 표준과 급진적으로 충돌합니다. 유니 코드 표준은 글자뿐만 아니라 모두 소문자 여야한다고 말합니다. 그 외에도 General_Category 및 Script 속성의 두 가지 속성 만 지원됩니다. '\ X' 또는 equiv를 통해 grapheme 클러스터를 지원하지 않습니다. '\ N {NAME}'지원은 없습니다. 유니 코드 지원 수준이 가장 낮은 레벨 1의 나머지 부분이 누락되었습니다. – tchrist

+0

@steenslag : "a"와 곡절 악센트를 가진 사용자 인식 문자 인 grapheme 클러스터를 일치시키기위한 완전히 합리적이고 실제로 필요한 패턴을 고려하십시오. 그러나 정규화 양식을 먼저 모르는 곳에서 NFKD ($ s) = ~/(? = a \ p {Grapheme_Extend} * \ N {합쳐지는 동그라미 부호}) \ X/ix'. 루비에서 어떻게 할 수 있습니까?Ruby와 Python은 [Unicode Regexes의 UTS # 18] (http://unicode.org/reports/tr18/)의 ** MINIMAL ** 요구 사항을 충족시키는 데 거의 사용할 수 없습니다. * 지금 보시겠습니까? * – tchrist

1

Ruby 및 Python 용 정규식 라이브러리는 두 개의 완전히 독립적 인 팀에 의해 개발되었습니다. 비록 그들이 동일하더라도 (그리고 나는 그들이 확실하다는 것을 확신하지 못할 것입니다.) 미래에 언젠가 갈라지지 않을 것이라는 보장은 없습니다.

가장 안전한 위치는 지금은 다르다고 가정하고 앞으로도 계속 달라질 것이라고 가정하는 것입니다.

5

정규 표현식의 경우 Perl에서 영감을 얻은 Ruby의/pattern/구문을 좋아합니다. 파이썬의 re.compile ("패턴")은 나에게 정말 우아하지 않습니다. Ruby의 신택스 설탕과 파이썬에서 정규 표현식이 별도의 모듈이된다는 사실은 정규 표현식에 관해서 루비쪽으로 기울어지게 만듭니다.

이와 별개로 일반 정규식 프로그래밍 관점과의 차이점은별로 없습니다. 두 언어 모두 상당히 포괄적이며 거의 유사한 RE 지원을 제공합니다. 성능 차이가있을 수 있습니다 (파이썬은 전통적으로 더 나은 성능을 가짐) 또한 파이썬은 유니 코드 정규 표현식을 더 많이 지원합니다.

+0

[몇 가지 표준 유니 코드 속성] (http://unicode.org/reports/tr44/#Property_Index) 파이썬 지원합니까? 또한, '\ X' 또는 아마도 \ p {Grapheme_Base} \ p {Grapheme_Extend}를 통해 파이썬이 [적당한 글자체 클러스터] (http://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table) } *'? 대/소문자를 구분하지 않는 대다수의 유니 코드 대/소문자 폴딩 가능한 유니 코드 코드 포인트를 안정적으로 사용할 수 있습니까? 아니면 여전히 BMP 제한 (유니 코드는 * ahem *을 금지합니까?)에 의해 허물어지고 있습니까? BTW, 나는 너를 찢어 버리고있어, 너무 심각하게 받아들이지 마. – tchrist

+4

라이브러리와 함께 측면에 못 박히지 않고 정규 표현식을 핵심 언어와 긴밀하게 연결하면 사용성이 크게 달라집니다. – tchrist

2

질문에 대한 정규식의 경우에만 : 둘 다. Perl을 사용하십시오.

해결하려는 다른 정규 표현식 문제와 해당 언어로 된 커뮤니티 지원에 따라 해당 언어를 선택해야합니다.

당신이 진정으로 만 정규식 지원을 기반으로 언어를 따기 경우 - 펄을 선택 ...

1

루비의 Regexp#match 방법은 파이썬의 re.search()하지 re.match()에 해당합니다. re.search()Regexp#match 문자열의 첫 번째 일치 항목을 찾으십시오. re.match()은 문자열 시작 부분에서만 일치를 찾습니다.

re.match()과 동등한 작업을 수행하려면 Ruby 정규 표현식을 ^으로 시작해야하며 문자열 시작 부분과 일치해야합니다.

Regexp#match과 동등한 작업을 수행하려면 파이썬 정규 표현식을 .*으로 시작해야하며 일치하는 0 개 이상의 문자가 있어야합니다.