Python에 대한 완전한 문장 부호 세트 (ASCII뿐만 아니라)


40

일반적으로 접할 수있는 모든 문장 부호가있는 목록이나 라이브러리가 있습니까?

일반적으로을 사용 string.punctuation하지만 일부 문장 부호 문자는 포함되지 않습니다.

>>> "'" in string.punctuation
True
>>> "’" in string.punctuation
False

이것이 귀하의 질문에 대답합니까? 줄에서 구두점을 제거하는 가장 좋은 방법
airstrike

9
@airstrike 전혀 없습니다.
samuelbrody1249

답변:


54

이 확인으로 더 잘 할 수 있습니다.

>>> import unicodedata
>>> unicodedata.category("'").startswith("P")
True
>>> unicodedata.category("’").startswith("P")
True

유니 코드 범주 P *구두점 전용입니다 .

커넥터 (Pc), 대시 (Pd), 초기 견적 (Pi), 최종 견적 (Pf), 공개 (Ps), 닫기 (Pe), 기타 (Po)

빠른 회원 확인을 위해 사용할 수있는 철저한 수집을 준비하려면 다음과 같이 정해진 이해를 사용하십시오.

>>> import sys
>>> from unicodedata import category
>>> codepoints = range(sys.maxunicode + 1)
>>> punctuation = {c for i in codepoints if category(c := chr(i)).startswith("P")}
>>> "'" in punctuation
True
>>> "’" in punctuation
True

여기에 할당 표현식 은 이전 Python 버전과 동등한 Python 3.8 이상이 필요합니다.

chrs = (chr(i) for i in range(sys.maxunicode + 1))
punctuation = set(c for c in chrs if category(c).startswith("P"))

다른 문자 중 일부 string.punctuation는 실제로는 유니 코드 범주 Symbol에 있습니다. 원하는 경우 추가하기도 쉽습니다.


"punctuation"의 합리적인 정의에는 유니 코드 "Symbol"범주 Sc (통화 등 $), Sk (예 : 등 ^), Sm (math, like +또는 <) 및 아마도 So (기타 ©)가 포함됩니다.
dan04

3
@ dan04 이것이 바로 답변의 마지막 문단입니다. 물론 다른 사용자는 자신의 사용 사례에 따라 범주를 포함 / 제외하도록이 코드를 조정할 수 있습니다.
wim

16

문자가 문장 부호 문자인지 확인하려면 wim게시 한 답변 이 정확합니다.

질문 제목에서 알 수 있듯이 모든 문장 부호 문자 목록이 실제로 필요한 경우 다음을 사용할 수 있습니다.

import sys
from unicodedata import category
punctuation_chars =  [chr(i) for i in range(sys.maxunicode) 
                             if category(chr(i)).startswith("P")]

2

wim의 대답 은 함수를 사용하도록 코드를 변경할 수 있다면 좋습니다.

그러나 in연산자 를 사용해야하는 경우 (예 : 라이브러리 코드를 호출하는 경우) 오리 입력을 사용할 수 있습니다.

import unicodedata
class DuckType:
    def __contains__(self,s):
        return unicodedata.category(s).startswith("P")
punct=DuckType()
#print("'" in punct,'"' in punct,"a" in punct)

1

정규 표현식 (정규 표현식)에 대한 직업처럼 보입니다.

    import re
    text = re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE)

여기서 정규 표현식은 공백이나 단어 문자를 제외한 모든 문자와 일치합니다. 이 플래그 re.UNICODE는 전체 유니 코드 문자 집합을 일치시키는 데 사용됩니다.


여러 언어에서 작동하지 않습니다.>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
samuelbrody1249

1
@ samuelbrody1249 작동하지 않는 것은 무엇입니까? 그것은 당신의 예에서 작동합니다 ( \xc3이스케이프는 문장 부호 제거와 관련이없는 표현입니다).
lenz

1
@lenz \xc3는 올바른 유니 코드 인코딩이 아닙니다 æ. 입력 str(text)하면임을 확인할 수 있습니다 \xc3\xa6. 실제로 \xc3완전한 코드 포인트가 아닌 것 같습니다.
Federico Poloni

6
아 알 겠어요 str바이트 문자열이있는 Python 2를 사용하고있는 것 같습니다 . 유니 코드는 Py2에서 악몽이기 때문에 반드시 Python 3으로 전환해야합니다. 나를 위해, str('æ')같은 쇼 'æ', 그리고 ascii('æ')쇼로 '\xe6'올바른 코드 포인트이다. b'\xc3\xa6'의 UTF-8 인코딩 'æ'이지만 일반적으로 사용하려는 것은 아닙니다.
lenz

0

다른 답변에서 지적 했듯이이 작업을 수행하는 방법은 유니 코드 속성 / 범주를 사용하는 것입니다. 허용되는 답변 은 표준 라이브러리 unicodedata모듈을 통해이 정보에 액세스 하지만 필요한 상황에 따라 정규식을 사용하여 동일한 속성 정보에 액세스하는 것이 더 빠르거나 더 편리 할 수 ​​있습니다.

그러나 표준 라이브러리 re모듈 은 확장 유니 코드 지원을 제공하지 않습니다. 이를 위해서는 PyPI ( ) 에서 사용할 수 있는 regex모듈 이 필요합니다 pip install regex.

>>> import regex as re
>>> re.match("\p{Punctuation}", "'")
<regex.Match object; span=(0, 1), match="'">
>>> re.match("\p{Punctuation}", "’")
<regex.Match object; span=(0, 1), match='’'>

정규식을 사용하여 검색 할 수있는 모든 종류의 유니 코드 속성에 대한 개요가 여기 에 제공 됩니다 . PyPI 홈페이지에 문서화되어있는 이러한 추가 정규식 기능 외에도 regex의도적으로와 동일한 API를 제공 re하므로 re의 설명서를 사용하여 이들 중 하나를 사용하는 방법을 알아낼 것으로 예상됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.