Toàn bộ dấu chấm câu cho Python (không chỉ ASCII)


40

Có một danh sách hoặc thư viện có tất cả các dấu chấm mà chúng ta thường gặp phải không?

Thông thường tôi sử dụng string.punctuation, nhưng một số ký tự dấu chấm câu không được bao gồm trong đó, ví dụ:

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

Điều này có trả lời câu hỏi của bạn không? Cách tốt nhất để loại bỏ dấu câu từ một chuỗi
không kích

9
@airstrike không không.
samuelbrody1249

Câu trả lời:


54

Bạn có thể làm tốt hơn với kiểm tra này:

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

Các loại Unicode P * được dành riêng cho Dấu câu :

đầu nối (Pc), dấu gạch ngang (Pd), trích dẫn ban đầu (Pi), trích dẫn cuối cùng (Pf), mở (Ps), đóng (Pe), khác (Po)

Để chuẩn bị bộ sưu tập đầy đủ, mà sau đó bạn có thể sử dụng để kiểm tra tư cách thành viên nhanh chóng, hãy sử dụng một bộ hiểu:

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

Biểu thức chuyển nhượng ở đây yêu cầu Python 3.8+, tương đương với các phiên bản Python cũ hơn:

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

Coi chừng một số ký tự khác string.punctuationthực sự nằm trong biểu tượng Unicode . Thật dễ dàng để thêm những người trong nếu bạn muốn.


Một định nghĩa hợp lý về dấu chấm câu của Google, bao gồm các loại Unicode Unicode Biểu tượng biểu tượng Sc (tiền tệ, thích $), Sk (sửa đổi, thích ^), Sm (toán học, thích +hoặc <), và có thể (khác, như© ).
dan04

3
@ dan04 Đó là những gì đoạn cuối của câu trả lời được đề cập. Tất nhiên những người khác có thể điều chỉnh mã này để bao gồm / loại trừ các danh mục tùy thuộc vào trường hợp sử dụng của riêng họ.
wim

16

Câu trả lời được đăng bởi wim là chính xác nếu bạn muốn kiểm tra xem một ký tự có phải là ký tự dấu chấm câu hay không.

Nếu bạn thực sự cần một danh sách tất cả các ký tự dấu chấm câu như tiêu đề câu hỏi của bạn, bạn có thể sử dụng như sau:

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

2

Câu trả lời của wim là tuyệt vời nếu bạn có thể thay đổi mã của mình để sử dụng hàm.

Nhưng nếu bạn phải sử dụng intoán tử (ví dụ: bạn đang gọi mã thư viện), bạn có thể sử dụng kiểu gõ vịt:

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

Đó có vẻ là một công việc tuyệt vời cho một biểu thức thông thường (regrec):

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

Ở đây, biểu thức chính quy phù hợp với mọi thứ trừ khoảng trắng hoặc ký tự từ. Cờ re.UNICODEđược sử dụng để khớp với toàn bộ các ký tự Unicode.


không hoạt động với nhiều ngôn ngữ:>>> text="Den som dræber - fanget" >>> re.sub(r"[^\w\s]", "", str(text), flags=re.UNICODE) 'Den som dr\xc3ber fanget'
samuelbrody1249

1
@ samuelbrody1249 Ý bạn là nó không hoạt động? Nó không hoạt động trong ví dụ của bạn ( \xc3lối thoát là một điều đại diện không liên quan đến tước dấu chấm câu).
lenz

1
@lenz \xc3không phải là mã hóa Unicode chính xác của æ; nếu bạn gõ str(text)bạn có thể xác nhận rằng nó là \xc3\xa6. Trên thực tế \xc3dường như không phải là một mật mã hoàn chỉnh.
Federico Poloni

6
Ồ tôi hiểu rồi. Có vẻ như cả hai bạn đang sử dụng Python 2, trong đó strlà một chuỗi byte. Bạn chắc chắn nên chuyển sang Python 3, vì Unicode là cơn ác mộng trong Py2. Đối với tôi, str('æ')hiển thị như 'æ', và ascii('æ')hiển thị '\xe6', đó là mật mã chính xác. b'\xc3\xa6'là mã hóa UTF-8 'æ', nhưng đây không phải là thứ bạn muốn làm việc với.
lenz

0

Như các câu trả lời khác đã chỉ ra, cách để thực hiện điều này là thông qua các thuộc tính / danh mục Unicode. Câu trả lời được chấp nhận truy cập thông tin này thông qua unicodedatamô-đun thư viện tiêu chuẩn , nhưng tùy thuộc vào ngữ cảnh nơi bạn cần, có thể nhanh hơn hoặc thuận tiện hơn để truy cập cùng thông tin thuộc tính này bằng các biểu thức thông thường.

Tuy nhiên, remô-đun thư viện tiêu chuẩn không cung cấp hỗ trợ Unicode mở rộng. Đối với điều đó, bạn cần regexmô-đun , có sẵn trên PyPI ( 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='’'>

Tổng quan tốt về tất cả các loại thuộc tính Unicode khác nhau mà bạn có thể tìm kiếm bằng cách sử dụng các biểu thức thông thường được cung cấp tại đây . Ngoài các tính năng biểu thức chính quy bổ sung này, được ghi lại trên trang chủ PyPI của nó, regexcố tình cung cấp API giống như revậy, vì vậy bạn sẽ sử dụng retài liệu của mình để tìm ra cách sử dụng một trong số chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.