ฉันจะตัดเครื่องหมายคำพูดคู่แรกและคู่สุดท้ายได้อย่างไร


102

ฉันต้องการตัดคำพูดคู่จาก:

string = '"" " " ""\\1" " "" ""'

ที่จะได้รับ:

string = '" " " ""\\1" " "" "'

ผมพยายามที่จะใช้rstrip, lstripและstrip('[^\"]|[\"$]')แต่มันก็ไม่ได้ทำงาน

ฉันจะทำเช่นนี้ได้อย่างไร?


5
คำตอบที่ถูกต้องจะได้รับด้านล่าง สำหรับแนวทางของคุณstripโปรดทราบว่า a) วิธีนี้ไม่ได้ใช้ regex เป็นอาร์กิวเมนต์ b) regex ที่คุณให้มาจะไม่ได้ผลอยู่ดีและ c) วิธีนี้จะดึงอักขระที่อยู่ติดกันทั้งหมดไม่ใช่แค่ตัวเดียวดังนั้น .strip('"')คุณจะต้องสูญเสียสองราคาคู่กับ
Tim Pietzcker

คำตอบ:


189

หากคำพูดที่คุณต้องการตัดมักจะเป็น "แรกและสุดท้าย" ตามที่คุณกล่าวไว้คุณสามารถใช้:

string = string[1:-1]


อันล่างปลอดภัยกว่า!
R Claven

93

หากคุณไม่สามารถสันนิษฐานได้ว่าสตริงทั้งหมดที่คุณประมวลผลมีเครื่องหมายอัญประกาศคู่คุณสามารถใช้สิ่งนี้ได้:

if string.startswith('"') and string.endswith('"'):
    string = string[1:-1]

แก้ไข:

ฉันแน่ใจว่าคุณเพิ่งใช้stringเป็นชื่อตัวแปรสำหรับตัวอย่างที่นี่และในโค้ดจริงของคุณมีชื่อที่เป็นประโยชน์ แต่ฉันรู้สึกว่าจำเป็นต้องเตือนคุณว่ามีโมดูลที่ตั้งชื่อstringอยู่ในไลบรารีมาตรฐาน มันไม่ได้โหลดโดยอัตโนมัติ แต่ถ้าคุณเคยใช้import stringตรวจสอบให้แน่ใจว่าตัวแปรของคุณไม่ทำให้เกิดปัญหา


1
หากสตริงเป็น "" "(เครื่องหมายคำพูดคู่เพียงตัวเดียว) สิ่งนี้จะลบอักขระเดี่ยวออกฉันคิดว่านี่อาจไม่ใช่สิ่งที่ต้องการอาจเป็นเพราะ Walapa ต้องการลบเครื่องหมายคำพูดคู่ถ้าตรงกันเท่านั้น
dbn

44

ในการลบอักขระตัวแรกและตัวสุดท้ายและในแต่ละกรณีให้ทำการลบเฉพาะในกรณีที่อักขระที่เป็นปัญหาเป็นเครื่องหมายคำพูดคู่:

import re

s = re.sub(r'^"|"$', '', s)

โปรดทราบว่ารูปแบบ RE แตกต่างจากที่คุณกำหนดและการดำเนินการคือsub("แทน") ด้วยสตริงการแทนที่ว่างเปล่า ( stripเป็นวิธีการสตริง แต่มีบางอย่างที่แตกต่างจากความต้องการของคุณตามที่คำตอบอื่น ๆ ระบุไว้)


4
การใช้ RE นี่เป็นการใช้ IMHO มากเกินไป ฉันชอบการแก้ปัญหาด้วยstartsWith.
pihentagy

19
Pythonistas จำนวนมากมีปฏิกิริยาคล้ายกับ REs ซึ่งไม่ยุติธรรมจริงๆ - REs ค่อนข้างเร็ว นอกจากนี้วิธีการแก้ปัญหาที่คุณ "ชอบ" ตามที่โพสต์นั้นจะแตกต่างไปจากเดิมอย่างสิ้นเชิง (ลบถ่านตัวแรกและตัวสุดท้ายก็ต่อเมื่อทั้งคู่เป็นเครื่องหมายคำพูดคู่ซึ่งดูเหมือนจะแตกต่างจากข้อกำหนดของ OP) - หากมีเครื่องหมายคำพูดนำหน้าและต่อท้าย (ในปัจจุบัน) จำเป็นต้องลบออกอย่างอิสระแก้ปัญหาที่จะกลายเป็น 4 งบ 2 เงื่อนไขบล็อก - ตอนนี้ว่า 's overkill เมื่อเทียบกับเดียวแสดงออกได้เร็วขึ้นสำหรับงานเดียวกัน -!)
อเล็กซ์เทล

44

สำคัญ:ฉันกำลังขยายคำถาม / คำตอบเพื่อตัดเครื่องหมายคำพูดเดี่ยวหรือคู่ และฉันตีความคำถามเพื่อหมายความว่าต้องมีเครื่องหมายคำพูดทั้งคู่และตรงกันเพื่อแสดงแถบ มิฉะนั้นสตริงจะถูกส่งกลับโดยไม่เปลี่ยนแปลง

ในการ "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)


1
หากคุณตรวจสอบก่อนว่าตัวอักษรแรกและตัวสุดท้ายเหมือนกันคุณจะต้องตรวจสอบว่าอักขระตัวแรกเป็นเครื่องหมายคำพูดหรือไม่: def strip_if_quoted (name): if name [0] == name [-1] และ name [0 ] in ("'",' "'): return name [1: -1]
TomOnTime

@TomOnTime: คุณพูดถูกนั่นคือการเพิ่มประสิทธิภาพที่ดี ฉันได้นำไปใช้แล้ว
ToolmakerSteve

4
ฉันขอแนะนำให้จัดการสตริงที่มีความยาวไม่เกิน 2 อักขระ ตอนนี้ฟังก์ชันนี้สามารถโยนดัชนีออกนอกขอบเขตข้อยกเว้นสำหรับสตริงที่มีความยาว 0 ได้นอกจากนี้คุณสามารถตัดเครื่องหมายคำพูดจากสตริงที่มีความยาว 1 อักขระ คุณสามารถเพิ่มยามlen(s) >= 2หรืออะไรก็ได้ที่คล้ายกัน
BrennanR


9

เกือบเสร็จแล้ว. อ้างจากhttp://docs.python.org/library/stdtypes.html?highlight=strip#str.strip

อาร์กิวเมนต์ chars คือสตริงที่ระบุชุดของอักขระที่จะลบออก

[... ]

อาร์กิวเมนต์ chars ไม่ใช่คำนำหน้าหรือคำต่อท้าย แต่ชุดค่าผสมทั้งหมดจะถูกตัดออก:

ดังนั้นอาร์กิวเมนต์ไม่ใช่ regexp

>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>> 

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


ตอบสนองจุดประสงค์ของฉันได้อย่างสมบูรณ์แบบ! ขอบคุณมาก.
Harsh Wardhan

4

หากคุณแน่ใจว่ามีเครื่องหมาย "ตอนต้นและตอนท้ายซึ่งคุณต้องการนำออกให้ทำดังนี้

string = string[1:len(string)-1]

หรือ

string = string[1:-1]

2

ลบสตริงที่กำหนดตั้งแต่เริ่มต้นและสิ้นสุดจากสตริง

s = '""Hello World""'
s.strip('""')

> 'Hello World'

1

ฉันมีรหัสบางอย่างที่ต้องการตัดเครื่องหมายคำพูดเดี่ยวหรือคู่และฉันไม่สามารถเพียงแค่ ast.literal_eval ได้

if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
    arg = arg[1:-1]

สิ่งนี้คล้ายกับคำตอบของ ToolmakerSteve แต่อนุญาตให้มีความยาว 0 สตริงและไม่เปลี่ยนอักขระเดี่ยว"ให้เป็นสตริงว่าง


0

ในตัวอย่างของคุณคุณสามารถใช้แถบ แต่คุณต้องระบุที่ว่าง

string = '"" " " ""\\1" " "" ""'
string.strip('" ')  # output '\\1'

สังเกตว่า \ 'ในเอาต์พุตคือเครื่องหมายคำพูดหลามมาตรฐานสำหรับเอาต์พุตสตริง

ค่าของตัวแปรของคุณคือ '\\ 1'


0

ฟังก์ชันด้านล่างจะตัดช่องว่างและส่งคืนสตริงโดยไม่มีเครื่องหมายคำพูด หากไม่มีเครื่องหมายคำพูดก็จะส่งคืนสตริงเดียวกัน (ขีดฆ่า)

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


-1

ค้นหาตำแหน่งของตัวแรกและตัวสุดท้าย "ในสตริงของคุณ

>>> s = '"" " " ""\\1" " "" ""'
>>> l = s.find('"')
>>> r = s.rfind('"')

>>> s[l+1:r]
'" " " ""\\1" " "" "'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.