명명 된 정규식 그룹“(? P <group_name> regexp)”:“P”는 무엇을 의미합니까?


178

파이썬에서 (?P<group_name>…) 구문 은 이름을 통해 일치하는 문자열을 참조 할 수 있도록 합니다 .

>>> import re
>>> match = re.search('(?P<name>.*) (?P<phone>.*)', 'John 123456')
>>> match.group('name')
'John'

"P"는 무엇을 의미합니까? 공식 문서 에서 힌트를 찾을 수 없습니다 .

학생들이이 구문을 기억하도록 돕는 방법에 대한 아이디어를 얻고 싶습니다. "P"가 무엇을 나타내는 지 아는 것이 유용 할 것입니다.


8
P의 약자 Placeholder.
kev

1
@ kev : 그 대답이 될 것 같아?
ninjagecko

3
추측이 적절하기 때문에 나는 Ken Thompson이 히피 동정 자이며 "P"는 "Patchouli"를 의미한다고 추측합니다.
aaronasterling

2
이 질문은 "그룹"아래 의 스택 오버 플로우 정규 표현식 FAQ 에 추가되었습니다 .
aliteralmind

6
그건 그렇고, 당신이 사용하는 경우 match.groups(AN으로 s) 당신이 자동의 튜플 얻을 것이다 모든 그룹을 -_- groups('name')=> ('John', '123456')당신이 실제로 원한 무엇을 할 때 group('name')=> 'John' 나는이 어딘가에 시간 (들) 사람을 절약 할 수 있기를 바랍니다.
szmoore 2019

답변:


262

우리 모두가 추측하기 때문에, 나는 또한 내 것을 줄 수도 있습니다. 나는 항상 그것이 파이썬을 대표한다고 생각했습니다. 파이썬에서 P? -그러나 나의 방어에서 나는 막연하게 기억했다 이 실 [강조]을 .

제목 : 클레임 (? P ...) 정규식 구문 확장

보낸 사람 : Guido van Rossum (gui ... @ CNRI.Reston.Va.US)

날짜 : 1997 년 12 월 10 일 오후 3:36:19

Perl 개발자 (Perl 언어를 개발하는 개발자)에게 특별한 요청이 있습니다. 나는 이것이 (perl5 포터)가 올바른 목록이기를 바랍니다. 파이썬 string-sig는 내가 여기서 논의하고있는 대부분의 작업의 기원이기 때문에 참조합니다.

아마도 파이썬을 알고있을 것입니다. 저는 Python의 제작자입니다. 올해 말까지 다음 "주요"버전 인 Python 1.5를 출시 할 계획입니다. 앞으로 파이썬과 펄이 공존 할 수 있기를 바랍니다. 교차 수분은 두 언어 모두에 유용 할 수 있습니다. (Larry는 Perl 5에 객체를 추가했을 때 Python을 잘 보았으며 O'Reilly는 두 언어에 관한 책을 출판합니다.)

아시다시피 Python 1.5는 Perl의 구문과 더 일치하는 새로운 정규식 모듈을 추가합니다. 우리는 파이썬의 구문 내에서 가능한 한 Perl 구문에 가깝게 노력했습니다. 그러나 정규식 구문에는 파이썬 특정 확장명이 있으며, 모두 (? P로 시작합니다. 현재 두 가지가 있습니다.

(?P<foo>...)일반 그룹 괄호와 유사하지만
그룹이 일치 한 텍스트 는 기호 그룹 이름 "foo"를 통해 일치가 수행 된 후 액세스 할 수 있습니다.

(?P=foo)"foo"라는 그룹과 일치하는 문자열과 일치합니다. 그룹이
숫자가 아닌 이름으로 참조된다는 점을 제외하고 \ 1, \ 2 등과 같습니다 .

이 Python 전용 확장 프로그램이 Perl 정규식 구문에 대한 향후 Perl 확장 프로그램과 충돌하지 않기를 바랍니다. 당신이 사용할 계획이있는 경우 (? P, 우리는 충돌을 해결할 수 있도록 우리가 가능한 한 빨리 알려 주시기 바랍니다. (? P 구문은 영구적으로 파이썬 특정 구문 확장을 위해 예약 할 수 있다면, 그렇지 않으면 좋을 것이다. (IS를 어떤 종류의 확장 레지스트리가 있습니까?)

Larry Wall이 대답 한 내용 :

[...] 현재로서는 레지스트리가 없습니다. 귀하의 외부 perl5 포터 외부로부터의 첫 번째 요청이므로 매우 낮은 대역폭의 활동입니다. (죄송합니다. 지난 주 인터넷 세계에서 뉴욕을 떠났습니다.)

어쨌든, 내가 걱정하는 한, 당신은 확실히 내 축복으로 'P'를 가질 수 있습니다. (분명히 Perl은이 시점에서 'P'가 필요하지 않습니다. :-) [...]

그래서 P의 원래 선택이 패턴에 의해 동기가 된 것이 무엇인지 모르겠습니다. 자리 표시 자? 펭귄? -하지만 왜 항상 파이썬과 관련이 있는지 이해할 수 있습니다. (1) 정규 표현식이 마음에 들지 않고 가능한 한 피하는 것이 좋습니다. (2) 15 년 전에이 스레드가 발생했습니다.


4
"파이썬 전용 확장명"?
jmort253

50
와우, 당신은 여기서 좋은 과거 데이터의 일부를 발견했습니다! Guido의 게시물에 대한 나의 해석은 "P"는 "Python-specific extensions"을 나타냅니다.
Eric O Lebigot

1
네, 그것은 저에게 결정적인 것 같습니다. 따라서 Perl과 PCRE가 처음에 구문을 복사 한 것은 아이러니 한 일입니다. 파이썬이 명명 된 캡처를 지원하는 최초의 맛이기 때문입니다. 그러나 그들은 (?<group_name>…)가장 대중적인 것으로 보이는 구문 도 지원합니다 . 심지어 Java도 지금 그것을 지원합니다.
Alan Moore

3
+1 이것은 가장 어색한 답변 중 하나입니다. :). 처음에 나는 이것이 너무 바보라고 생각했다. 그러나 결국, 나는 완전히 동의했다.
Sumudu

4
나는 파이썬을 만든 사람조차도 Perl이 관여 할 때 기괴한 비전 구문을 사용한다는 것을 좋아합니다. 파이썬에 Perl 특정 확장 / 구문을 추가하려고하면 거리에 피가 묻어있을 것입니다.
Keith Ripley

20

무늬! 그룹은 나중에 정규 표현식에서 사용하기 위해 (하위) 패턴을 명명합니다. 이러한 그룹이 사용되는 방법에 대한 자세한 내용은 여기 설명서를 참조하십시오 .


3
+1 : 이것은 좋은 니모닉 장치입니다 : (?P<name>…)"pattern name"입니다. 그러나 정규 표현식에서는 모든 것이 패턴이므로 (?P<…>…)그룹을 패턴 으로 만 레이블링하는 것은 이상합니다 . 그러나 이것은 내 학생들을 위해 할 것입니다. :)
Eric O Lebigot

1
@EOL은 학생들에게 잘못된 것을 가르치지 않습니다. 당신이 생각하는 것보다 정확성에 도달하면 잘려 내기가 더 어렵습니다. 예 : 나에게는 몇 년이 걸린다 5. 역설적으로, 우연히 이야기하는 것이 좋습니다. 예를 들어 항상 그것에 대해 매우 명확하고 명시 적입니다. 당신의 이전 의견을 학생들에게 전체 길이로 말하십시오 (아마 마지막 문장을 개정;).
n611x007

5

파이썬 확장. Python Docos에서 :

Perl 개발자가 선택한 솔루션은 확장 구문으로 (? ...)를 사용하는 것입니다. ? 괄호 바로 뒤에 구문 오류가 있었기 때문에? 반복 할 것이 없으므로 호환성 문제가 발생하지 않았습니다. ? 바로 뒤에 나오는 문자 사용중인 확장명을 표시하므로 (? = foo)는 한 가지 (긍정적 인 미리보기 어설 션)이고 (? : foo)는 다른 것 (하위 표현 foo를 포함하는 캡처하지 않은 그룹)입니다.

파이썬은 여러 Perl의 확장을 지원하고 Perl의 확장 구문에 확장 구문을 추가합니다. 물음표 다음의 첫 번째 문자가 P 인 경우 해당 문자가 Python에만 해당되는 확장임을 알고 있습니다.

https://docs.python.org/3/howto/regex.html


잘 발견되었습니다! 이것은 DSM의 느낌을 확인합니다.
Eric O Lebigot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.