แทนที่อักขระที่ไม่ใช่ตัวเลขและตัวอักษรทั้งหมดในสตริง


102

ฉันมีสตริงที่ฉันต้องการแทนที่อักขระใด ๆ ที่ไม่ใช่อักขระมาตรฐานหรือตัวเลขเช่น (az หรือ 0-9) ด้วยเครื่องหมายดอกจัน ตัวอย่างเช่น "h ^ & ell`., | ow] {+ orld" จะถูกแทนที่ด้วย "h * ell * o * w * orld" โปรดทราบว่าอักขระหลายตัวเช่น "^ &" จะถูกแทนที่ด้วยเครื่องหมายดอกจันหนึ่งตัว ฉันจะทำสิ่งนี้ได้อย่างไร?


คำตอบ:


188

Regex เพื่อช่วยเหลือ!

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

ตัวอย่าง:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'

7
หากคุณจัดการกับ Unicode เป็นจำนวนมากคุณอาจต้องเก็บสัญลักษณ์ Unicode ที่ไม่ใช่ ASCII ไว้ทั้งหมด:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha

หากคุณต้องการเว้นช่องว่างในสตริงของคุณให้เพิ่มช่องว่างภายในวงเล็บ: s = re.sub ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher

3
หากทำการแทนที่มากกว่าหนึ่งครั้งสิ่งนี้จะทำงานได้เร็วขึ้นเล็กน้อยหากคุณรวบรวม regex ไว้ล่วงหน้าเช่นimport re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris

นอกจากนี้หมายเหตุ\Wสำหรับอักขระที่ไม่ใช่คำเกือบจะเหมือนกัน แต่อนุญาตให้ขีดล่างเป็นอักขระคำ (ไม่รู้ว่าทำไม): docs.python.org/3.6/library/re.html#index-32
JHS

คุณไม่ต้องการ "+" ใน regex
Serg

39

วิธี pythonic

print "".join([ c if c.isalnum() else "*" for c in s ])

สิ่งนี้ไม่ได้จัดการกับการจัดกลุ่มอักขระที่ไม่ตรงกันหลายตัวต่อเนื่องกันกล่าวคือ

"h^&i => "h**iไม่"h*i"เหมือนกับในโซลูชัน regex


11

ลอง:

s = filter(str.isalnum, s)

ใน Python3:

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

แก้ไข: ตระหนักว่า OP ต้องการแทนที่ non-chars ด้วย '*' คำตอบของฉันไม่พอดี


11

ใช้\Wซึ่งเทียบเท่ากับ[^a-zA-Z0-9_]. ตรวจสอบเอกสารhttps://docs.python.org/2/library/re.html

Import re
s =  'h^&ell`.,|o w]{+orld'
replaced_string = re.sub(r'\W+', '*', s)
output: 'h*ell*o*w*orld'

อัปเดต: โซลูชันนี้จะไม่รวมขีดล่างด้วย หากคุณต้องการยกเว้นเฉพาะตัวอักษรและตัวเลขการแก้ปัญหาโดย nneonneo จะเหมาะสมกว่า


1
โปรดทราบว่า\Wเทียบเท่ากับ[^a-zA-Z0-9_]ใน Python 2.x เท่านั้น ใน Python 3.x \W+เทียบเท่ากับ[^a-zA-Z0-9_]เฉพาะ if re.ASCII/ re.Aflag เท่านั้นที่ใช้
Wiktor Stribiżew
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.