วิธีรวมใบเสนอราคาในสตริง Python ดิบ


91

พิจารณา:

>>> r"what"ever"
SyntaxError: invalid syntax
>>> r"what\"ever"
'what\\"ever'

แล้วเราจะได้รับใบเสนอราคาอย่างไร แต่ไม่ใช่เครื่องหมายทับ?

และโปรดอย่าแนะนำ r'what"ever'เพราะคำถามจะกลายเป็นว่าเรารวมคำพูดทั้งสองประเภทได้อย่างไร?

ที่เกี่ยวข้อง


ในกรณีการใช้งานที่สร้างแรงจูงใจสำหรับสตริงดิบ (regexes และกรณีอื่น ๆ ที่สิ่งอื่นที่ไม่ใช่ Python ตีความเครื่องหมายแบ็กสแลช) แบ็กสแลชนั้นใช้ได้เพราะจะถูกประมวลผลโดยเอนจิน regex / เอ็นจินใดก็ตาม สิ่งนี้ใช้ไม่ได้กับทุกกรณีที่คุณอาจต้องการใช้สตริงดิบ แต่อย่าลืมพิจารณาว่าจะใช้ได้กับกรณีการใช้งานของคุณหรือไม่ก่อนที่คุณจะพยายามนำแบ็กสแลชออก
user2357112 รองรับ Monica

คำตอบ:


148

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

r'what"ever'

หากคุณต้องการคำพูดทั้งสองประเภทในสตริงของคุณให้ใช้สตริงที่ยกมาสามตัว:

r"""what"ev'er"""

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


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

3
ฉันชอบย่อหน้าสุดท้ายเหมือนกัน ... นี่คือสิ่งที่ฉันพยายามคิดออก ข้อ จำกัด ของรูปแบบการเสนอราคาที่แตกต่างกัน ฉันกำลังเปรียบเทียบ Python กับr"raw string"C # @"@-quoted string"และ"""triple quotes"""
mpen

2
Python newb ที่นี่สับสนเล็กน้อยไม่ใช่r'what"ever"ข้อผิดพลาดในการแยกวิเคราะห์หรือไม่? คุณหมายถึงr'what"ever'?
nmr

1
เกิดอะไรขึ้นกับนักพัฒนา Python ทำไมพวกเขาถึงไม่ติดตั้งระบบ Escape เหมือนภาษาอื่น ๆ ?
Jamby

6
@Jamby พวกเขาจะมีระบบการหลบหนีของคุณเพียงแค่ใช้มันกับสตริงไม่ใช่ดิบ (สตริงโดยไม่ต้อง R ในด้านหน้าของพวกเขา) และมันทำงานเหมือนสวยมากทุกภาษาอื่น
Coburn

10

Python มีมากกว่าหนึ่งวิธีในการสร้างสตริง ไวยากรณ์สตริงต่อไปนี้อนุญาตให้คุณใช้เครื่องหมายคำพูดคู่:

'''what"ever'''

1
คุณพลาดส่วนดิบของคำถาม
mpen

10

หากคุณต้องการการอ้างอิงประเภทใด ๆ (เดี่ยวคู่และสามสำหรับทั้งสอง) คุณสามารถ "รวม" (0) สตริง:

>>> raw_string_with_quotes = r'double"' r"single'" r'''double triple""" ''' r"""single triple''' """
>>> print raw_string_with_quotes
double"single'double triple""" single triple'''

คุณยังสามารถ "รวม" (0) สตริงดิบกับสตริงที่ไม่ใช่ดิบได้:

>>> r'raw_string\n' 'non-raw string\n'
'raw_string\\nnon-raw string\n'

(0): ในความเป็นจริงตัวแยกวิเคราะห์ Python จะเชื่อมโยงสตริงและไม่ได้สร้างหลายสตริง หากคุณเพิ่มโอเปอเรเตอร์ "+" สตริงหลายสตริงจะถูกสร้างและรวมกัน



3

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

somestr = """This is a string with a special need to have a " in it at the end""""

คุณจะพบข้อผิดพลาดในการดำเนินการเนื่องจากเครื่องหมายคำพูด "" "(4) ในแถวทำให้เครื่องอ่านสตริงสับสนเนื่องจากคิดว่ามันถึงจุดสิ้นสุดของสตริงแล้วและพบว่า" สุ่ม "อยู่ที่นั่นคุณสามารถตรวจสอบสิ่งนี้ได้ โดยการใส่ช่องว่างลงในเครื่องหมายคำพูด 4 คำดังนี้: "" "" และจะไม่มีข้อผิดพลาด

ในกรณีพิเศษนี้คุณจะต้องใช้:

somestr = 'This.....at the end"'

หรือใช้วิธีการที่อธิบายไว้ข้างต้นในการสร้างสตริงหลาย ๆ สายโดยผสม "และ" แล้วเชื่อมต่อกันหลังจากข้อเท็จจริง


1

เพียงเพื่อรวมฟังก์ชันที่เข้ากันได้กับ Python f String ใหม่:

var_a = 10

f"""This is my quoted variable: "{var_a}". """

f-strings รองรับการหลบหนีใช่หรือไม่? f"foo\"bar"ดังนั้นคุณสามารถทำได้
mpen

-3

ใช้:

dqote='"'
sqote="'"

ใช้ตัวดำเนินการ '+' และdqoteและsquoteตัวแปรเพื่อรับสิ่งที่คุณต้องการ

ถ้าฉันต้องการsed -e s/",u'"/",'"/g -e s/^"u'"/"'"/คุณสามารถลองทำสิ่งต่อไปนี้:

dqote='"'
sqote="'"
cmd1="sed -e s/" + dqote + ",u'" + dqote + "/" + dqote + ",'" + dqote + '/g -e s/^"u' + sqote + dqote + '/' + dqote + sqote + dqote + '/'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.