วิธีที่ดีที่สุดในการตัดเครื่องหมายวรรคตอนจากสตริง


636

ดูเหมือนว่าควรมีวิธีที่ง่ายกว่า:

import string
s = "string. With. Punctuation?" # Sample string 
out = s.translate(string.maketrans("",""), string.punctuation)

มีอะไรบ้าง


3
ดูเหมือนจะตรงไปตรงมากับฉัน ทำไมคุณต้องการเปลี่ยน หากคุณต้องการให้ง่ายขึ้นเพียงแค่ห่อสิ่งที่คุณเพิ่งเขียนในฟังก์ชั่น
Hannes Ovrén

2
ดูเหมือนว่าแฮ็คประเภทนี้จะใช้ผลข้างเคียงของ str.translate ในการทำงาน ฉันคิดว่าอาจมีบางอย่างที่เหมือน str.strip (ตัวอักษร) ที่ทำงานกับสตริงทั้งหมดแทนที่จะเป็นแค่ขอบเขตที่ฉันพลาดไป
Lawrence Johnston

2
ขึ้นอยู่กับข้อมูลด้วย การใช้สิ่งนี้กับข้อมูลที่มีชื่อเซิร์ฟเวอร์ที่มีเครื่องหมายขีดล่างเป็นส่วนหนึ่งของชื่อ เพียงแค่ให้แน่ใจว่าคุณรู้ข้อมูลและสิ่งที่มัน conatains หรือคุณอาจท้ายด้วยส่วนย่อยของปัญหา clbuttic
EBGreen

54
ขึ้นอยู่กับสิ่งที่คุณเรียกว่าเครื่องหมายวรรคตอน " The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees." มีอักขระเครื่องหมายวรรคตอนที่หนึ่งตัวที่สอง "."
John Machin

37
ฉันประหลาดใจที่ไม่มีใครพูดถึงstring.punctuationแต่ไม่มีเครื่องหมายวรรคตอนที่ไม่ใช่ภาษาอังกฤษเลย ฉันกำลังคิดถึง。,!?: ד”〟 และอื่น ๆ
Clément

คำตอบ:


929

จากมุมมองประสิทธิภาพคุณจะไม่เอาชนะ

s.translate(None, string.punctuation)

สำหรับ Python เวอร์ชันที่สูงกว่าให้ใช้รหัสต่อไปนี้:

s.translate(str.maketrans('', '', string.punctuation))

มันแสดงการทำงานของสตริงข้อมูลดิบใน C พร้อมกับตารางการค้นหา - มีไม่มากที่จะเอาชนะได้ แต่เขียนโค้ด C ของคุณเอง

หากความเร็วไม่ต้องกังวลตัวเลือกอื่นก็คือ:

exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)

วิธีนี้เร็วกว่า s.replace เมื่อใช้ถ่านแต่ละตัว แต่จะไม่ทำงานเช่นเดียวกับวิธีการที่ไม่ใช้งานของไพ ธ อนเช่น regexes หรือ string.translate อย่างที่คุณเห็นจากการกำหนดเวลาด้านล่าง สำหรับปัญหาประเภทนี้ให้ทำในระดับต่ำที่สุดเท่าที่จะทำได้

รหัสเวลา:

import re, string, timeit

s = "string. With. Punctuation"
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))

def test_set(s):
    return ''.join(ch for ch in s if ch not in exclude)

def test_re(s):  # From Vinko's solution, with fix.
    return regex.sub('', s)

def test_trans(s):
    return s.translate(table, string.punctuation)

def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s

print "sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)

สิ่งนี้ให้ผลลัพธ์ต่อไปนี้:

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802

27
ขอบคุณสำหรับข้อมูลจังหวะเวลาฉันกำลังคิดที่จะทำอะไรแบบนั้น แต่ตัวคุณเองก็เขียนได้ดีกว่าสิ่งที่ฉันจะทำและตอนนี้ฉันสามารถใช้เป็นแม่แบบสำหรับรหัสเวลาในอนาคตที่ฉันต้องการเขียน :)
Lawrence Johnston

29
คำตอบที่ดี คุณสามารถทำให้มันง่ายขึ้นโดยการลบตาราง เอกสารกล่าวว่า: "ตั้งค่าอาร์กิวเมนต์ของตารางเป็น None สำหรับการแปลที่ลบเฉพาะอักขระ" ( docs.python.org/library/stdtypes.html#str.translate )
Alexandros Marinos

3
น่าสังเกตว่าการแปล () จะทำงานแตกต่างกันสำหรับวัตถุ str และ unicode ดังนั้นคุณต้องแน่ใจว่าคุณกำลังทำงานกับประเภทข้อมูลเดียวกันเสมอ แต่วิธีการในคำตอบนี้ใช้ได้ดีกับทั้งคู่ซึ่งมีประโยชน์
Richard J

36
ใน Python3 table = string.maketrans("","")ควรถูกแทนที่ด้วยtable = str.maketrans({key: None for key in string.punctuation})?
SparkAndShine

19
เพื่ออัปเดตการสนทนาในฐานะของ Python 3.6 regexเป็นวิธีที่มีประสิทธิภาพที่สุด! มันเร็วกว่าการแปลเกือบ 2 เท่า นอกจากนี้ชุดและเปลี่ยนจะไม่เลวอีกต่อไป! พวกเขาทั้งสองได้รับการปรับปรุงโดยใช้ตัวคูณ 4 :)
Ryan Soklaski

143

การแสดงออกปกตินั้นง่ายพอถ้าคุณรู้

import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)

4
@Outlier คำอธิบาย: แทนที่ไม่ได้ (^) อักขระคำหรือช่องว่างด้วยสตริงว่าง ระวังแม้ว่า \ w จะขีดเส้นใต้บ่อยเกินไปตัวอย่างเช่น
Matthias

4
@SIslam ฉันคิดว่ามันจะทำงานร่วมกับ Unicode กับชุดธง Unicode s = re.sub(r'[^\w\s]','',s, re.UNICODE)คือ ทดสอบกับ python 3 บน linux มันทำงานได้โดยไม่ต้องตั้งค่าสถานะโดยใช้ตัวอักษรทมิฬ, อย่างไรก็ตาม.
Matthias

@Matthias ฉันลองใช้รหัสด้วย Python 3.6.5 บน Mac ผลลัพธ์ของตัวอักษรภาษาทมิฬมีลักษณะแตกต่างออกไปเล็กน้อยinput்กลายเป็นதமழ ฉันไม่มีความรู้เกี่ยวกับทมิฬไม่แน่ใจว่าเป็นสิ่งที่คาดหวัง
shiouming

70

เพื่อความสะดวกในการใช้งานฉันได้สรุปบันทึกการเว้นวรรคตอนจากทั้งใน Python 2 และ Python 3 โปรดอ้างอิงคำตอบอื่น ๆ สำหรับคำอธิบายโดยละเอียด


Python 2

import string

s = "string. With. Punctuation?"
table = string.maketrans("","")
new_s = s.translate(table, string.punctuation)      # Output: string without punctuation

Python 3

import string

s = "string. With. Punctuation?"
table = str.maketrans(dict.fromkeys(string.punctuation))  # OR {key: None for key in string.punctuation}
new_s = s.translate(table)                          # Output: string without punctuation

51
myString.translate(None, string.punctuation)

4
อ่าฉันลองแล้ว แต่มันก็ไม่ได้ผลในทุกกรณี myString.translate (string.maketrans ("", ""), string.punctuation) ทำงานได้ดี
Aidan Kane

12
โปรดทราบว่าstrใน Python 3 และunicodePython 2 deletecharsไม่รองรับอาร์กิวเมนต์
agf

4
myString.translate (string.maketrans ("", ""), string.punctuation) จะไม่ทำงานกับสตริง unicode (ค้นพบวิธีที่ยาก)
Marc Maxmeister

44
TypeError: translate() takes exactly one argument (2 given):(
Brian Tingle

3
@BrianTingle: ดูรหัส Python 3 ในความคิดเห็นของฉัน (มันผ่านหนึ่งอาร์กิวเมนต์) ตามลิงค์เพื่อดูรหัส Python 2 ที่ทำงานกับยูนิโค้ดและการปรับ Python 3 ของมัน
jfs

29

ฉันมักจะใช้สิ่งนี้:

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'

2
หนึ่งซับน่าเกลียด: reduce(lambda s,c: s.replace(c, ''), string.punctuation, s).
jfs

1
ยอดเยี่ยม แต่ไม่ได้ลบความรู้สึกบางอย่างเช่นยัติภังค์อีกต่อไป
Vladimir Stazhilov

25

string.punctuationเป็น ASCII เท่านั้น ! วิธีที่ถูกต้องมากขึ้น (แต่ช้ากว่ามาก) คือการใช้โมดูล unicodedata:

# -*- coding: utf-8 -*-
from unicodedata import category
s = u'String — with -  «punctation »...'
s = ''.join(ch for ch in s if category(ch)[0] != 'P')
print 'stripped', s

คุณสามารถพูดคุยและแยกประเภทตัวละครอื่น ๆ ได้เช่นกัน:

''.join(ch for ch in s if category(ch)[0] not in 'SP')

นอกจากนี้ยังจะตัดอักขระ~*+§$ที่อาจหรือไม่เป็น "เครื่องหมายวรรคตอน" ขึ้นอยู่กับมุมมองของบุคคล


3
คุณสามารถ:regex.sub(ur"\p{P}+", "", text)
jfs

น่าเสียดายสิ่งต่างๆเช่น~นี้ไม่ได้เป็นส่วนหนึ่งของหมวดหมู่เครื่องหมายวรรคตอน คุณต้องทดสอบหมวดสัญลักษณ์ด้วยเช่นกัน
CJ Jackson

24

ไม่จำเป็นว่าจะง่ายกว่า แต่เป็นวิธีที่ต่างไปถ้าคุณคุ้นเคยกับตระกูลใหม่มากกว่า

import re, string
s = "string. With. Punctuation?" # Sample string 
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)

1
ทำงานได้เนื่องจาก string.punctuation มีลำดับ - ในลำดับที่เหมาะสมจากน้อยไปมากไม่มีช่องว่าง ASCII ในขณะที่ Python มีสิทธิ์นี้เมื่อคุณพยายามใช้สตริงย่อยการใช้เครื่องหมายวรรคตอนมันอาจเป็น show-stopper เนื่องจากความประหลาดใจ "-"
S.Lott

2
จริงๆแล้วมันยังผิดอยู่ ลำดับ "\]" ได้รับการปฏิบัติเหมือนการหลบหนี (บังเอิญไม่ปิด] ดังนั้นเพื่อหลีกเลี่ยงความล้มเหลวอื่น) แต่ทิ้ง \ unescaped คุณควรใช้ re.escape (string.punctuation) เพื่อป้องกันสิ่งนี้
Brian

1
ใช่ฉันละไว้เพราะมันใช้งานได้เป็นตัวอย่างในการทำให้สิ่งต่าง ๆ เรียบง่าย แต่คุณพูดถูกว่าควรรวมเข้าไว้
Vinko Vrsalovic

13

สำหรับงูหลาม 3 strหรืองูหลาม 2 unicodeค่าstr.translate()ใช้เวลาเพียงพจนานุกรม; codepoints (จำนวนเต็ม) จะถูกค้นหาในการจับคู่Noneนั้น

หากต้องการลบเครื่องหมายวรรคตอน (บางส่วน) ให้ใช้:

import string

remove_punct_map = dict.fromkeys(map(ord, string.punctuation))
s.translate(remove_punct_map)

dict.fromkeys()วิธีการเรียนทำให้มันเล็กน้อยเพื่อสร้างแผนที่การตั้งค่าทั้งหมดจะNoneขึ้นอยู่กับลำดับของคีย์

หากต้องการลบเครื่องหมายวรรคตอนทั้งหมดไม่ใช่แค่เครื่องหมายวรรคตอน ASCII ตารางของคุณต้องใหญ่กว่าเดิม ดูคำตอบของ JF Sebastian (เวอร์ชั่น Python 3):

import unicodedata
import sys

remove_punct_map = dict.fromkeys(i for i in range(sys.maxunicode)
                                 if unicodedata.category(chr(i)).startswith('P'))

เพื่อรองรับ Unicode string.punctuationนั้นไม่เพียงพอ ดูคำตอบของฉัน
JFS

@JFSebastian: แน่นอนคำตอบของฉันคือใช้ตัวละครเดียวกับที่ได้รับการโหวตสูงสุด เพิ่มตาราง Python 3 ของคุณ
Martijn Pieters

คำตอบที่ได้รับการโหวตสูงสุดใช้งานได้กับสตริง ascii เท่านั้น คำตอบของคุณอ้างว่าสนับสนุน Unicode อย่างชัดเจน
jfs

1
@JFSebastian: ใช้งานได้กับสตริง Unicode มันแถบเครื่องหมายวรรคตอน ASCII ฉันไม่เคยอ้างสิทธิ์ว่าจะใช้เครื่องหมายวรรคตอนทั้งหมด :-) จุดเพื่อให้เทคนิคที่ถูกต้องสำหรับunicodeวัตถุเทียบกับงูหลาม 2 strวัตถุ
Martijn Pieters

12

string.punctuationคิดถึงเครื่องหมายวรรคตอนที่ใช้กันทั่วไปในโลกแห่งความจริง วิธีการแก้ปัญหาที่ใช้กับเครื่องหมายวรรคตอนที่ไม่ใช่ ASCII ได้อย่างไร

import regex
s = u"string. With. Some・Really Weird、Non?ASCII。 「(Punctuation)」?"
remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)
remove.sub(u" ", s).strip()

โดยส่วนตัวฉันเชื่อว่านี่เป็นวิธีที่ดีที่สุดในการลบเครื่องหมายวรรคตอนออกจากสตริงใน Python เพราะ:

  • มันลบเครื่องหมายวรรคตอน Unicode ทั้งหมด
  • มันเป็นเรื่องที่สามารถแก้ไขได้ง่ายเช่นคุณสามารถเอา\{S}ถ้าคุณต้องการที่จะลบเครื่องหมายวรรคตอน $แต่ให้สัญลักษณ์เช่น
  • คุณสามารถเจาะจงเฉพาะเกี่ยวกับสิ่งที่คุณต้องการเก็บไว้และสิ่งที่คุณต้องการลบตัวอย่างเช่น\{Pd}จะลบเครื่องหมายขีดคั่นเท่านั้น
  • regex นี้ยังทำให้ช่องว่างเป็นปกติ มันแมปแท็บการขึ้นบรรทัดใหม่และสิ่งแปลก ๆ อื่น ๆ ให้เป็นช่องว่างที่ดี

คุณสมบัตินี้จะใช้อักขระ Unicode ซึ่งคุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิกิพีเดีย


9

ฉันยังไม่เห็นคำตอบนี้ เพียงใช้ regex มันลบตัวละครทั้งหมดนอกเหนือจากตัวอักษรคำ ( \w) และตัวอักษรตัวเลข ( \d) ตามด้วยตัวอักษรช่องว่าง ( \s):

import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(ur'[^\w\d\s]+', '', s)

1
\d\wซ้ำซ้อนเพราะมันเป็นส่วนหนึ่งของ
blhsing

อักขระตัวเลขถือเป็นชุดย่อยของอักขระ Word ได้หรือไม่ ฉันคิดว่าตัวละคร Word เป็นตัวละครที่สามารถสร้างคำจริงเช่น a-zA-Z?
Blairg23

ใช่ "คำ" ใน regex ประกอบด้วยตัวอักษรตัวเลขและขีดล่าง โปรดดูคำอธิบาย\wในเอกสารประกอบ: docs.python.org/3/library/re.html
blhsing

8

ต่อไปนี้เป็นหนึ่งในสายการบินสำหรับ Python 3.5:

import string
"l*ots! o(f. p@u)n[c}t]u[a'ti\"on#$^?/".translate(str.maketrans({a:None for a in string.punctuation}))

7

นี่อาจไม่ใช่ทางออกที่ดีที่สุด แต่นี่เป็นวิธีที่ฉันทำ

import string
f = lambda x: ''.join([i for i in x if i not in string.punctuation])

6

นี่คือฟังก์ชั่นที่ฉันเขียน มันไม่ได้มีประสิทธิภาพมาก แต่มันง่ายและคุณสามารถเพิ่มหรือลบเครื่องหมายวรรคตอนที่คุณต้องการ:

def stripPunc(wordList):
    """Strips punctuation from list of words"""
    puncList = [".",";",":","!","?","/","\\",",","#","@","$","&",")","(","\""]
    for punc in puncList:
        for word in wordList:
            wordList=[word.replace(punc,'') for word in wordList]
    return wordList

5
import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(r'[^a-zA-Z0-9\s]', '', s)

ดูเหมือนว่าจะใช้ได้กับอักขระ ASCII เท่านั้น
avirr

5

เช่นเดียวกับการอัพเดตฉันเขียนตัวอย่าง @Brian ใน Python 3 อีกครั้งและทำการเปลี่ยนแปลงเพื่อย้ายขั้นตอนการคอมไพล์ regex ภายในฟังก์ชัน ความคิดของฉันที่นี่คือเวลาทุกขั้นตอนที่จำเป็นเพื่อให้ฟังก์ชั่นการทำงาน บางทีคุณกำลังใช้การคำนวณแบบกระจายและไม่สามารถแบ่งปันวัตถุ regex ระหว่างพนักงานของคุณและต้องมีre.compileขั้นตอนที่ผู้ปฏิบัติงานแต่ละคน นอกจากนี้ฉันยังอยากรู้อยากเห็นถึงเวลาที่การนำ maketrans ไปใช้กับ Python 3 แตกต่างกันสองแบบ

table = str.maketrans({key: None for key in string.punctuation})

VS

table = str.maketrans('', '', string.punctuation)

นอกจากนี้ฉันได้เพิ่มวิธีอื่นในการใช้ชุดซึ่งฉันใช้ประโยชน์จากฟังก์ชั่นการตัดกันเพื่อลดจำนวนการวนซ้ำ

นี่คือรหัสที่สมบูรณ์:

import re, string, timeit

s = "string. With. Punctuation"


def test_set(s):
    exclude = set(string.punctuation)
    return ''.join(ch for ch in s if ch not in exclude)


def test_set2(s):
    _punctuation = set(string.punctuation)
    for punct in set(s).intersection(_punctuation):
        s = s.replace(punct, ' ')
    return ' '.join(s.split())


def test_re(s):  # From Vinko's solution, with fix.
    regex = re.compile('[%s]' % re.escape(string.punctuation))
    return regex.sub('', s)


def test_trans(s):
    table = str.maketrans({key: None for key in string.punctuation})
    return s.translate(table)


def test_trans2(s):
    table = str.maketrans('', '', string.punctuation)
    return(s.translate(table))


def test_repl(s):  # From S.Lott's solution
    for c in string.punctuation:
        s=s.replace(c,"")
    return s


print("sets      :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000))
print("sets2      :",timeit.Timer('f(s)', 'from __main__ import s,test_set2 as f').timeit(1000000))
print("regex     :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000))
print("translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000))
print("translate2 :",timeit.Timer('f(s)', 'from __main__ import s,test_trans2 as f').timeit(1000000))
print("replace   :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000))

นี่คือผลลัพธ์ของฉัน:

sets      : 3.1830138750374317
sets2      : 2.189873124472797
regex     : 7.142953420989215
translate : 4.243278483860195
translate2 : 2.427158243022859
replace   : 4.579746678471565

4
>>> s = "string. With. Punctuation?"
>>> s = re.sub(r'[^\w\s]','',s)
>>> re.split(r'\s*', s)


['string', 'With', 'Punctuation']

2
โปรดแก้ไขด้วยข้อมูลเพิ่มเติม รหัสเท่านั้นและคำตอบ "ลองนี้" จะหมดกำลังใจเพราะพวกเขาไม่มีเนื้อหาที่ค้นหาได้และไม่อธิบายว่าทำไมคนควร "ลองนี้"
Paritosh

4

นี่คือวิธีการแก้ปัญหาโดยไม่ต้อง regex

import string

input_text = "!where??and!!or$$then:)"
punctuation_replacer = string.maketrans(string.punctuation, ' '*len(string.punctuation))    
print ' '.join(input_text.translate(punctuation_replacer).split()).strip()

Output>> where and or then
  • แทนที่เครื่องหมายวรรคตอนด้วยช่องว่าง
  • แทนที่ช่องว่างหลายช่องในระหว่างคำด้วยช่องว่างเดียว
  • ลบช่องว่างต่อท้ายหากมีแถบ ()


2
#FIRST METHOD
#Storing all punctuations in a variable    
punctuation='!?,.:;"\')(_-'
newstring='' #Creating empty string
word=raw_input("Enter string: ")
for i in word:
     if(i not in punctuation):
                  newstring+=i
print "The string without punctuation is",newstring

#SECOND METHOD
word=raw_input("Enter string: ")
punctuation='!?,.:;"\')(_-'
newstring=word.translate(None,punctuation)
print "The string without punctuation is",newstring


#Output for both methods
Enter string: hello! welcome -to_python(programming.language)??,
The string without punctuation is: hello welcome topythonprogramminglanguage

2
with open('one.txt','r')as myFile:

    str1=myFile.read()

    print(str1)


    punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"] 

for i in punctuation:

        str1 = str1.replace(i," ") 
        myList=[]
        myList.extend(str1.split(" "))
print (str1) 
for i in myList:

    print(i,end='\n')
    print ("____________")

0

ทำไมคุณไม่ใช้สิ่งนี้

 ''.join(filter(str.isalnum, s)) 

ช้าเกินไป?


โปรดทราบว่าจะเป็นการลบช่องว่างด้วย
Georgy

0

พิจารณายูนิโค้ด รหัสตรวจสอบใน python3

from unicodedata import category
text = 'hi, how are you?'
text_without_punc = ''.join(ch for ch in text if not category(ch).startswith('P'))

-1

ลบคำหยุดออกจากไฟล์ข้อความโดยใช้ Python

print('====THIS IS HOW TO REMOVE STOP WORS====')

with open('one.txt','r')as myFile:

    str1=myFile.read()

    stop_words ="not", "is", "it", "By","between","This","By","A","when","And","up","Then","was","by","It","If","can","an","he","This","or","And","a","i","it","am","at","on","in","of","to","is","so","too","my","the","and","but","are","very","here","even","from","them","then","than","this","that","though","be","But","these"

    myList=[]

    myList.extend(str1.split(" "))

    for i in myList:

        if i not in stop_words:

            print ("____________")

            print(i,end='\n')

-2

ฉันชอบที่จะใช้ฟังก์ชั่นเช่นนี้:

def scrub(abc):
    while abc[-1] is in list(string.punctuation):
        abc=abc[:-1]
    while abc[0] is in list(string.punctuation):
        abc=abc[1:]
    return abc

1
นี่คือการลอกอักขระจากจุดเริ่มต้นและจุดสิ้นสุด ใช้abc.strip(string.punctuation)แทนสิ่งนั้น มันจะไม่ลบตัวอักษรเช่นที่อยู่ตรงกลาง
Martijn Pieters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.