ฉันต้องการตัดคำพูดคู่จาก:
string = '"" " " ""\\1" " "" ""'
ที่จะได้รับ:
string = '" " " ""\\1" " "" "'
ผมพยายามที่จะใช้rstrip
, lstrip
และstrip('[^\"]|[\"$]')
แต่มันก็ไม่ได้ทำงาน
ฉันจะทำเช่นนี้ได้อย่างไร?
ฉันต้องการตัดคำพูดคู่จาก:
string = '"" " " ""\\1" " "" ""'
ที่จะได้รับ:
string = '" " " ""\\1" " "" "'
ผมพยายามที่จะใช้rstrip
, lstrip
และstrip('[^\"]|[\"$]')
แต่มันก็ไม่ได้ทำงาน
ฉันจะทำเช่นนี้ได้อย่างไร?
คำตอบ:
หากคำพูดที่คุณต้องการตัดมักจะเป็น "แรกและสุดท้าย" ตามที่คุณกล่าวไว้คุณสามารถใช้:
string = string[1:-1]
หากคุณไม่สามารถสันนิษฐานได้ว่าสตริงทั้งหมดที่คุณประมวลผลมีเครื่องหมายอัญประกาศคู่คุณสามารถใช้สิ่งนี้ได้:
if string.startswith('"') and string.endswith('"'):
string = string[1:-1]
แก้ไข:
ฉันแน่ใจว่าคุณเพิ่งใช้string
เป็นชื่อตัวแปรสำหรับตัวอย่างที่นี่และในโค้ดจริงของคุณมีชื่อที่เป็นประโยชน์ แต่ฉันรู้สึกว่าจำเป็นต้องเตือนคุณว่ามีโมดูลที่ตั้งชื่อstring
อยู่ในไลบรารีมาตรฐาน มันไม่ได้โหลดโดยอัตโนมัติ แต่ถ้าคุณเคยใช้import string
ตรวจสอบให้แน่ใจว่าตัวแปรของคุณไม่ทำให้เกิดปัญหา
ในการลบอักขระตัวแรกและตัวสุดท้ายและในแต่ละกรณีให้ทำการลบเฉพาะในกรณีที่อักขระที่เป็นปัญหาเป็นเครื่องหมายคำพูดคู่:
import re
s = re.sub(r'^"|"$', '', s)
โปรดทราบว่ารูปแบบ RE แตกต่างจากที่คุณกำหนดและการดำเนินการคือsub
("แทน") ด้วยสตริงการแทนที่ว่างเปล่า ( strip
เป็นวิธีการสตริง แต่มีบางอย่างที่แตกต่างจากความต้องการของคุณตามที่คำตอบอื่น ๆ ระบุไว้)
startsWith
.
สำคัญ:ฉันกำลังขยายคำถาม / คำตอบเพื่อตัดเครื่องหมายคำพูดเดี่ยวหรือคู่ และฉันตีความคำถามเพื่อหมายความว่าต้องมีเครื่องหมายคำพูดทั้งคู่และตรงกันเพื่อแสดงแถบ มิฉะนั้นสตริงจะถูกส่งกลับโดยไม่เปลี่ยนแปลง
ในการ "dequote" การแทนค่าสตริงนั้นอาจมีเครื่องหมายคำพูดเดี่ยวหรือคู่อยู่รอบ ๆ (นี่คือส่วนขยายของคำตอบของ @ tgray):
def dequote(s):
"""
If a string has single or double quotes around it, remove them.
Make sure the pair of quotes match.
If a matching pair of quotes is not found, return the string unchanged.
"""
if (s[0] == s[-1]) and s.startswith(("'", '"')):
return s[1:-1]
return s
คำอธิบาย:
startswith
สามารถใช้ทูเพิลเพื่อจับคู่กับทางเลือกอื่น ๆ เหตุผลของวงเล็บสองชั้น((
และ))
เพื่อให้เราส่งผ่านพารามิเตอร์ ONE("'", '"')
ไปยังstartswith()
เพื่อระบุคำนำหน้าที่อนุญาตแทนที่จะเป็นพารามิเตอร์สองตัว"'"
และ'"'
ซึ่งจะถูกตีความว่าเป็นคำนำหน้าและตำแหน่งเริ่มต้น (ไม่ถูกต้อง)
s[-1]
เป็นอักขระสุดท้ายในสตริง
การทดสอบ:
print( dequote("\"he\"l'lo\"") )
print( dequote("'he\"l'lo'") )
print( dequote("he\"l'lo") )
print( dequote("'he\"l'lo\"") )
=>
he"l'lo
he"l'lo
he"l'lo
'he"l'lo"
(สำหรับฉันนิพจน์ regex ไม่ชัดเจนในการอ่านดังนั้นฉันจึงไม่ได้พยายามขยายคำตอบของ @ Alex)
len(s) >= 2
หรืออะไรก็ได้ที่คล้ายกัน
หากสตริงเป็นเสมอตามที่คุณแสดง:
string[1:-1]
เกือบเสร็จแล้ว. อ้างจากhttp://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
อาร์กิวเมนต์ chars คือสตริงที่ระบุชุดของอักขระที่จะลบออก
[... ]
อาร์กิวเมนต์ chars ไม่ใช่คำนำหน้าหรือคำต่อท้าย แต่ชุดค่าผสมทั้งหมดจะถูกตัดออก:
ดังนั้นอาร์กิวเมนต์ไม่ใช่ regexp
>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>>
โปรดทราบว่านี่ไม่ใช่สิ่งที่คุณร้องขอเนื่องจากกินคำพูดหลายคำจากทั้งสองด้านของสตริง!
หากคุณแน่ใจว่ามีเครื่องหมาย "ตอนต้นและตอนท้ายซึ่งคุณต้องการนำออกให้ทำดังนี้
string = string[1:len(string)-1]
หรือ
string = string[1:-1]
ลบสตริงที่กำหนดตั้งแต่เริ่มต้นและสิ้นสุดจากสตริง
s = '""Hello World""'
s.strip('""')
> 'Hello World'
ฉันมีรหัสบางอย่างที่ต้องการตัดเครื่องหมายคำพูดเดี่ยวหรือคู่และฉันไม่สามารถเพียงแค่ ast.literal_eval ได้
if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
arg = arg[1:-1]
สิ่งนี้คล้ายกับคำตอบของ ToolmakerSteve แต่อนุญาตให้มีความยาว 0 สตริงและไม่เปลี่ยนอักขระเดี่ยว"
ให้เป็นสตริงว่าง
ในตัวอย่างของคุณคุณสามารถใช้แถบ แต่คุณต้องระบุที่ว่าง
string = '"" " " ""\\1" " "" ""'
string.strip('" ') # output '\\1'
สังเกตว่า \ 'ในเอาต์พุตคือเครื่องหมายคำพูดหลามมาตรฐานสำหรับเอาต์พุตสตริง
ค่าของตัวแปรของคุณคือ '\\ 1'
ฟังก์ชันด้านล่างจะตัดช่องว่างและส่งคืนสตริงโดยไม่มีเครื่องหมายคำพูด หากไม่มีเครื่องหมายคำพูดก็จะส่งคืนสตริงเดียวกัน (ขีดฆ่า)
def removeQuote(str):
str = str.strip()
if re.search("^[\'\"].*[\'\"]$",str):
str = str[1:-1]
print("Removed Quotes",str)
else:
print("Same String",str)
return str
เริ่มต้นในPython 3.9
คุณสามารถใช้removeprefix
และremovesuffix
:
'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
ค้นหาตำแหน่งของตัวแรกและตัวสุดท้าย "ในสตริงของคุณ
>>> s = '"" " " ""\\1" " "" ""'
>>> l = s.find('"')
>>> r = s.rfind('"')
>>> s[l+1:r]
'" " " ""\\1" " "" "'
strip
โปรดทราบว่า a) วิธีนี้ไม่ได้ใช้ regex เป็นอาร์กิวเมนต์ b) regex ที่คุณให้มาจะไม่ได้ผลอยู่ดีและ c) วิธีนี้จะดึงอักขระที่อยู่ติดกันทั้งหมดไม่ใช่แค่ตัวเดียวดังนั้น.strip('"')
คุณจะต้องสูญเสียสองราคาคู่กับ