Làm cách nào tôi có thể bỏ dấu ngoặc kép đầu tiên và cuối cùng?


102

Tôi muốn loại bỏ dấu ngoặc kép từ:

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

để có được:

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

Tôi cố gắng để sử dụng rstrip, lstripstrip('[^\"]|[\"$]')nhưng nó đã không làm việc.

Tôi có thể làm cái này như thế nào?


5
Các câu trả lời chính xác được đưa ra dưới đây. Đối với cách tiếp cận của bạn 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('"').
Tim Pietzcker

Câu trả lời:


188

Nếu các dấu ngoặc kép bạn muốn loại bỏ luôn là "đầu tiên và cuối cùng" như bạn đã nói, thì bạn có thể chỉ cần sử dụng:

string = string[1:-1]


Cái bên dưới an toàn hơn!
R Claven

93

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 stringlà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 stringtrong 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 stringhãy đảm bảo rằng biến của bạn không làm lu mờ nó.


1
Nếu chuỗi là '"' (chỉ một dấu ngoặc kép), điều này sẽ xóa ký tự đơn. Tôi nghĩ đây có thể không phải là điều mong muốn, có lẽ Walapa muốn chỉ xóa dấu ngoặc kép nếu nó được khớp.
dbn

44

Để 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 ( striplà 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).


4
Sử dụng RE ở đây là IMHO quá mức cần thiết. Tôi thích giải pháp với startsWith.
pihentagy

19
Rất nhiều Pythonistas có phản ứng tương tự với RE, điều này thực sự không hợp lý - REs khá nhanh. Ngoài ra, giải pháp bạn "thích", như đã đăng, thực hiện một điều gì đó hoàn toàn khác (chỉ loại bỏ ký tự đầu tiên và ký tự cuối cùng nếu cả hai đều là dấu ngoặc kép - có vẻ khác với thông số kỹ thuật của OP) - nếu dấu ngoặc kép đầu và cuối (khi có) cần được loại bỏ một cách độc lập, giải pháp mà sẽ trở thành một 4 câu, 2 điều kiện khối - bây giờ rằng 's quá mức cần thiết so với một duy nhất, nhanh biểu hiện cho công việc tương tự -!)
Alex Martelli

44

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:

startswithcó 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 (())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ố "'"'"', 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.)


1
Nếu trước tiên bạn kiểm tra xem ký tự đầu tiên và ký tự cuối có giống nhau không, thì bạn chỉ cần kiểm tra xem ký tự đầu tiên có phải là dấu ngoặc kép hay không: def dải_if_quoted (name): if name [0] == name [-1] và name [0 ] in ("'",' "'): return name [1: -1]
TomOnTime

@TomOnTime: Bạn nói đúng, đó là một tối ưu hóa tốt. Tôi đã áp dụng nó.
ToolmakerSteve

4
Tôi khuyên bạn nên xử lý các chuỗi có 2 ký tự trở xuống. Ngay bây giờ, hàm này có thể ném một chỉ mục ra khỏi giới hạn ngoại lệ cho một chuỗi có độ dài 0. Ngoài ra, bạn có thể tách một trích dẫn từ một chuỗi dài 1 ký tự. Bạn có thể thêm một người bảo vệ len(s) >= 2, hoặc một cái gì đó tương tự.
BrennanR

15

Nếu chuỗi luôn như bạn hiển thị:

string[1:-1]

9

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!


Hoàn toàn phục vụ mục đích của tôi! Cảm ơn rất nhiều.
Harsh Wardhan

4

Nếu bạn chắc chắn có dấu "ở đầu và ở cuối mà bạn muốn xóa, chỉ cần thực hiện:

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

hoặc là

string = string[1:-1]

2

Loại bỏ một chuỗi xác định từ đầu và kết thúc khỏi một chuỗi.

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

> 'Hello World'

1

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.


0

trong ví dụ của bạn, bạn có thể sử dụng dải nhưng bạn phải cung cấp không gian

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

lưu ý \ 'trong đầu ra là dấu ngoặc kép python tiêu chuẩn cho đầu ra chuỗi

giá trị của biến của bạn là '\\ 1'


0

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


-1

tìm vị trí của "đầu tiên và cuối cùng" trong chuỗi của bạn

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

>>> s[l+1:r]
'" " " ""\\1" " "" "'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.