Câu trả lời:
Nếu bạn không thể cho rằng tất cả các chuỗi bạn xử lý đều có dấu ngoặc kép, bạn có thể sử dụng một cái gì đó như sau:
if string.startswith('"') and string.endswith('"'):
string = string[1:-1]
Biên tập:
Tôi chắc chắn rằng bạn vừa sử dụng string
làm tên biến cho ví dụ ở đây và trong mã thực của bạn, nó có một tên hữu ích, nhưng tôi cảm thấy có nghĩa vụ phải cảnh báo bạn rằng có một mô-đun có tên string
trong các thư viện tiêu chuẩn. Nó không được tải tự động, nhưng nếu bạn sử dụng, import string
hãy đảm bảo rằng biến của bạn không làm lu mờ nó.
Để xóa các ký tự đầu tiên và cuối cùng, và trong mỗi trường hợp, chỉ xóa nếu ký tự được đề cập là một dấu ngoặc kép:
import re
s = re.sub(r'^"|"$', '', s)
Lưu ý rằng mẫu RE khác với mẫu mà bạn đã đưa ra và hoạt động là sub
("thay thế") với một chuỗi thay thế trống ( strip
là một phương thức chuỗi nhưng thực hiện điều gì đó khá khác với yêu cầu của bạn, như các câu trả lời khác đã chỉ ra).
startsWith
.
QUAN TRỌNG: Tôi đang mở rộng câu hỏi / câu trả lời để loại bỏ dấu ngoặc kép đơn hoặc kép. Và tôi giải thích câu hỏi có nghĩa là CẢ HAI dấu ngoặc kép phải có mặt và khớp với nhau để thực hiện dải. Nếu không, chuỗi được trả về không thay đổi.
Để "trích dẫn" một biểu diễn chuỗi, có thể có dấu nháy đơn hoặc dấu ngoặc kép xung quanh nó (đây là phần mở rộng của câu trả lời của @ 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
Giải trình:
startswith
có thể lấy một tuple, để phù hợp với bất kỳ lựa chọn thay thế nào. Lý do cho dấu ngoặc đơn ĐÔI ((
và ))
là do chúng tôi chuyển MỘT tham số ("'", '"')
để startswith()
chỉ định các tiền tố được phép, thay vì HAI tham số "'"
và '"'
, sẽ được hiểu là một tiền tố và một vị trí bắt đầu (không hợp lệ).
s[-1]
là ký tự cuối cùng trong chuỗi.
Thử nghiệm:
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"
(Đối với tôi, biểu thức regex không rõ ràng để đọc, vì vậy tôi đã không cố gắng mở rộng câu trả lời của @ Alex.)
len(s) >= 2
, hoặc một cái gì đó tương tự.
Sắp xong. Trích dẫn từ http://docs.python.org/library/stdtypes.html?highlight=strip#str.strip
Đối số ký tự là một chuỗi chỉ định tập hợp các ký tự sẽ bị xóa.
[...]
Đối số ký tự không phải là tiền tố hoặc hậu tố; thay vào đó, tất cả các kết hợp giá trị của nó đều bị loại bỏ:
Vì vậy, đối số không phải là một regexp.
>>> string = '"" " " ""\\1" " "" ""'
>>> string.strip('"')
' " " ""\\1" " "" '
>>>
Lưu ý rằng đây không phải là chính xác những gì bạn yêu cầu, vì nó ăn nhiều dấu ngoặc kép từ cả hai phần cuối của chuỗi!
Tôi có một số mã cần loại bỏ dấu ngoặc kép đơn hoặc dấu ngoặc kép và tôi không thể chỉ đơn giản là ast.literal_eval nó.
if len(arg) > 1 and arg[0] in ('"\'') and arg[-1] == arg[0]:
arg = arg[1:-1]
Điều này tương tự như câu trả lời của ToolmakerSteve, nhưng nó cho phép các chuỗi có độ dài bằng 0 và không biến một ký tự "
thành một chuỗi rỗng.
Hàm dưới đây sẽ loại bỏ các spces trống và trả về các chuỗi không có dấu ngoặc kép. Nếu không có dấu ngoặc kép thì nó sẽ trả về cùng một chuỗi (bị tước bỏ)
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
Bắt đầu Python 3.9
, bạn có thể sử dụng removeprefix
và removesuffix
:
'"" " " ""\\1" " "" ""'.removeprefix('"').removesuffix('"')
# '" " " ""\\1" " "" "'
strip
, xin lưu ý rằng a) phương thức này không lấy regex làm đối số của nó, b) regex mà bạn cung cấp sẽ không hoạt động dù sao và c) phương pháp này loại bỏ tất cả các ký tự liền kề, không chỉ một, vì vậy bạn sẽ mất hai dấu ngoặc kép với.strip('"')
.