ฉันต้องลบอักขระพิเศษเครื่องหมายวรรคตอนและช่องว่างทั้งหมดออกจากสตริงเพื่อให้ฉันมีตัวอักษรและตัวเลขเท่านั้น
ฉันต้องลบอักขระพิเศษเครื่องหมายวรรคตอนและช่องว่างทั้งหมดออกจากสตริงเพื่อให้ฉันมีตัวอักษรและตัวเลขเท่านั้น
คำตอบ:
สิ่งนี้สามารถทำได้โดยไม่ต้อง regex:
>>> string = "Special $#! characters spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'
คุณสามารถใช้str.isalnum
:
S.isalnum() -> bool Return True if all characters in S are alphanumeric and there is at least one character in S, False otherwise.
หากคุณยืนยันในการใช้ regex โซลูชันอื่น ๆ จะทำได้ดี อย่างไรก็ตามโปรดทราบว่าหากสามารถทำได้โดยไม่ใช้นิพจน์ทั่วไปนั่นเป็นวิธีที่ดีที่สุดในการดำเนินการ
isalnum()
และ regex และ regex หนึ่งเร็วขึ้น 50-75%
นี่คือ regex เพื่อจับคู่สตริงของอักขระที่ไม่ใช่ตัวอักษรหรือตัวเลข:
[^A-Za-z0-9]+
นี่คือคำสั่ง Python เพื่อทำการทดแทน regex:
re.sub('[^A-Za-z0-9]+', '', mystring)
+
ปริมาณเพื่อปรับปรุงประสิทธิภาพของมันเล็กน้อย)
[^A-Za-z0-9 ]+
วิธีที่สั้นกว่า:
import re
cleanString = re.sub('\W+','', string )
หากคุณต้องการเว้นวรรคระหว่างคำและตัวเลขแทน '' ด้วย ''
r'\W+'
- ปิดหัวข้อเล็กน้อย (และอวดรู้มาก) แต่ฉันขอแนะนำให้นิสัยที่ทุกรูปแบบ regex เป็นสายอักขระดิบ
หลังจากเห็นสิ่งนี้ฉันสนใจที่จะขยายคำตอบที่ได้รับจากการค้นหาว่ามีการประมวลผลใดในเวลาที่น้อยที่สุดดังนั้นฉันจึงไปตรวจสอบคำตอบที่เสนอบางคำtimeit
กับสองตัวอย่าง:
string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
'.join(e for e in string if e.isalnum())
string1
- ผลลัพธ์: 10.7061979771string2
- ผลลัพธ์: 7.78372597694import re
re.sub('[^A-Za-z0-9]+', '', string)
string1
- ผลลัพธ์: 7.10785102844string2
- ผลลัพธ์: 4.12814903259import re
re.sub('\W+','', string)
string1
- ผลลัพธ์: 3.11899876595string2
- ผลลัพธ์: 2.78014397621ผลลัพธ์ข้างต้นเป็นผลิตภัณฑ์ของผลลัพธ์ที่ส่งคืนต่ำสุดจากค่าเฉลี่ยของ: repeat(3, 2000000)
ตัวอย่างที่ 3สามารถ 3x เร็วกว่าตัวอย่างที่ 1
''.join([*filter(str.isalnum, string)])
ฉันคิดว่าแค่filter(str.isalnum, string)
ใช้งานได้
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
ใน Python3 filter( )
ฟังก์ชั่นจะคืนค่าวัตถุที่สามารถตรวจสอบได้ หนึ่งจะต้องเข้าร่วมกลับเพื่อรับสตริงจาก itertable:
''.join(filter(str.isalnum, string))
หรือเพื่อใช้list
ในการเข้าร่วม ( ไม่แน่ใจ แต่สามารถเร็วได้เล็กน้อย )
''.join([*filter(str.isalnum, string)])
หมายเหตุ: การเปิดออกที่[*args]
ถูกต้องจากPython> = 3.5
map
, filter
และreduce
ผลตอบแทนวัตถุ itertable แทน ยังอยู่ใน Python3 + ฉันจะชอบ ''.join(filter(str.isalnum, string))
(หรือผ่านรายการในการเข้าร่วมใช้''.join([*filter(str.isalnum, string)])
) มากกว่าคำตอบที่ยอมรับ
''.join(filter(str.isalnum, string))
จะปรับปรุงfilter(str.isalnum, string)
อย่างน้อยอ่าน นี่เป็น Pythreenic (ใช่คุณสามารถใช้วิธีนี้) ทำสิ่งนี้ได้ไหม?
filter(str.isalnum, string)
ไม่ได้ส่งกลับสตริงใน Python3 เป็นfilter( )
ใน Python3 ส่งกลับ iterator มากกว่าประเภทอาร์กิวเมนต์แตกต่างจากงูหลาม-2 +.
#!/usr/bin/python
import re
strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr
คุณสามารถเพิ่มอักขระพิเศษเพิ่มเติมและจะถูกแทนที่ด้วย '' หมายความว่าไม่มีอะไรเช่นพวกเขาจะถูกลบออก
แตกต่างจากคนอื่น ๆ ที่ใช้ regex ฉันจะพยายามแยกตัวละครทุกตัวที่ไม่ใช่สิ่งที่ฉันต้องการแทนการระบุสิ่งที่ฉันไม่ต้องการอย่างชัดเจน
ตัวอย่างเช่นหากฉันต้องการเฉพาะอักขระจาก 'a ถึง z' (ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก) และตัวเลขฉันจะยกเว้นทุกอย่างอื่น:
import re
s = re.sub(r"[^a-zA-Z0-9]","",s)
ซึ่งหมายความว่า "แทนที่อักขระทุกตัวที่ไม่ใช่ตัวเลขหรืออักขระในช่วง 'a ถึง z' หรือ 'A to Z' ด้วยสตริงว่าง"
ในความเป็นจริงถ้าคุณใส่อักขระพิเศษ^
ในตำแหน่งแรกของ regex ของคุณคุณจะได้รับการปฏิเสธ
เคล็ดลับพิเศษ: หากคุณต้องการพิมพ์ผลลัพธ์ให้เล็กลงคุณสามารถทำให้ regex เร็วขึ้นและง่ายขึ้นตราบใดที่คุณไม่พบตัวพิมพ์ใหญ่ในตอนนี้
import re
s = re.sub(r"[^a-z0-9]","",s.lower())
สมมติว่าคุณต้องการใช้ regex และคุณต้องการ / ต้องการโค้ด Unicode-cognizant 2.x ที่พร้อมใช้งาน 2to3:
>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
วิธีการทั่วไปที่สุดคือการใช้ 'หมวดหมู่' ของตาราง unicodedata ซึ่งจัดประเภทอักขระทุกตัว เช่นรหัสต่อไปนี้กรองเฉพาะอักขระที่พิมพ์ได้ตามหมวดหมู่:
import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien
PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))
def filter_non_printable(s):
result = []
ws_last = False
for c in s:
c = unicodedata.category(c) in PRINTABLE and c or u'#'
result.append(c)
return u''.join(result).replace(u'#', u' ')
ดู URL ที่ให้ไว้ด้านบนสำหรับหมวดหมู่ที่เกี่ยวข้องทั้งหมด นอกจากนี้คุณยังสามารถกรองหลักสูตรตามหมวดหมู่วรรคตอน
$
ตอนท้ายของแต่ละเส้น?
string.punctuation มีอักขระดังต่อไปนี้:
'"# $% & \! '() * +, - / :; <=> @ [\] ^ _`. {|} ~'
คุณสามารถใช้ฟังก์ชั่นการแปลและ maketrans เพื่อแมปเครื่องหมายวรรคตอนกับค่าว่าง (แทนที่)
import string
'This, is. A test!'.translate(str.maketrans('', '', string.punctuation))
เอาท์พุท:
'This is A test'
ใช้การแปล:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Caveat: ใช้งานได้กับสตริง ascii เท่านั้น
TypeError: translate() takes exactly one argument (2 given)
กับ py3.4
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the
เช่นเดียวกับเครื่องหมายคำพูดคู่ "" "
# if we need to count the word python that ends with or without ',' or '.' at end
count = 0
for i in text:
if i.endswith("."):
text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
count += 1
print("The count of Python : ", text.count("python"))
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
และคุณจะเห็นผลลัพธ์ของคุณเป็น
'askhnlaskdjalsdk
re
แต่ไม่เคยใช้ replace
เกณฑ์ของคุณใช้ได้กับสตริงเฉพาะนี้เท่านั้น ถ้าสตริงของคุณคือabc = "askhnl#$%!askdjalsdk"
อะไร ฉันไม่คิดว่าจะทำงานกับสิ่งใดนอกจาก#$%
รูปแบบ อาจต้องการปรับแต่งมัน
การลบเครื่องหมายวรรคตอนตัวเลขและอักขระพิเศษ
ตัวอย่าง: -
รหัส
combi['tidy_tweet'] = combi['tidy_tweet'].str.replace("[^a-zA-Z#]", " ")
ขอบคุณ :)
สำหรับภาษาอื่น ๆ เช่นเยอรมัน, สเปน, เดนมาร์ก, ฝรั่งเศส ฯลฯ ที่มีอักขระพิเศษ (เช่นเยอรมัน "Umlaute" เป็นü
, ä
, ö
) เพียงแค่เพิ่มเหล่านี้เพื่อสตริงการค้นหา regex นี้:
ตัวอย่างภาษาเยอรมัน:
re.sub('[^A-ZÜÖÄa-z0-9]+', '', mystring)