2011-12-20 33 views
16

Tôi có một chuỗi mẫu <alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card] ...>, created=1324336085, description='Customer for My Test App', livemode=False>Lấy chuỗi trong dấu ngoặc trong Python

Tôi chỉ muốn giá trị cus_Y4o9qMEZAugtnW và KHÔNG card (đó là bên trong một [])

Làm thế nào tôi có thể làm điều đó theo cách đơn giản nhất có thể trong Python? Có thể bằng cách sử dụng RegEx (mà tôi không giỏi)?

Trả lời

40

Làm thế nào về:

import re 

s = "alpha.Customer[cus_Y4o9qMEZAugtnW] ..." 
m = re.search(r"\[([A-Za-z0-9_]+)\]", s) 
print m.group(1) 

Đối với tôi in này:

cus_Y4o9qMEZAugtnW 

Lưu ý rằng các cuộc gọi đến re.search(...) thấy trận đấu đầu tiên với cụm từ thông dụng, do đó, không tìm thấy số [card] trừ khi bạn lặp lại tìm kiếm lần thứ hai.

Edit: Các regular expression đây là một con trăn raw string literal, mà về cơ bản có nghĩa là dấu xồ nguợc không được đối xử như ký tự đặc biệt và được truyền thông qua các phương pháp re.search() không thay đổi. Các parts của biểu thức chính quy là:

  1. \[ phù hợp với một [ ký tự chữ
  2. ( bắt đầu một nhóm mới
  3. [A-Za-z0-9_] là một bộ ký tự phù hợp với bất kỳ chữ cái (vốn hay chữ thường), chữ số hoặc nhấn
  4. + khớp với phần tử trước (bộ ký tự) một hoặc nhiều lần.
  5. ) kết thúc nhóm
  6. \] phù hợp với một chữ ] nhân vật

Edit: Như DK đã chỉ ra, các biểu thức chính quy có thể được đơn giản hóa để:

m = re.search(r"\[(\w+)\]", s) 

kể từ khi \w là một chuỗi đặc biệt có nghĩa là giống như [a-zA-Z0-9_] tùy thuộc vào re.LOCALE một nd re.UNICODE cài đặt.

+1

bạn có thể vui lòng giải thích câu trả lời của bạn phần regex, để tôi donot phải hỏi lại cho loại tương tự của vấn đề. Cảm ơn. – user993563

+0

Tôi đã chỉnh sửa câu trả lời của mình với giải thích về cụm từ thông dụng và liên kết đến tài liệu biểu thức chính quy python. – srgerg

+5

Tại sao không thay thế '[A-Za-z0-9_]' bằng '\ w'? –

8

Bạn có thể sử dụng str.split để thực hiện việc này.

s = "<alpha.Customer[cus_Y4o9qMEZAugtnW] active_card=<alpha.AlphaObject[card]\ 
...>, created=1324336085, description='Customer for My Test App',\ 
livemode=False>" 
val = s.split('[', 1)[1].split(']')[0] 

Sau đó, chúng ta có:

>>> val 
'cus_Y4o9qMEZAugtnW' 
+0

Yeah, nó phụ thuộc vào bao nhiêu lộn xộn các dây đang có, nhưng sự chia rẽ có thể làm việc ở đây quá .. – redShadow

+0

dù nó wont có hiệu lực nhiều, nhưng cái nào trong hai sử dụng regex/split thì hiệu quả hơn. Ngoài ra, bạn có thể vui lòng giải thích phần tách của bạn. Cảm ơn. – user993563

+0

@ user993563 Hãy xem liên kết đến 'str.split' trong câu trả lời cho ví dụ. Tóm lại, 'split' đầu tiên trong giải pháp trả về một danh sách độ dài hai; phần tử đầu tiên là chuỗi con trước '[', phần tử thứ hai là chuỗi con sau ']'. Đối với hiệu suất, bạn nên đo lường để tìm hiểu (xem ['timeit'] (http://docs.python.org/library/timeit.html)). Nếu bạn dự định thực hiện trích xuất giá trị nhiều lần trong một lần chạy chương trình và quyết định sử dụng cụm từ thông dụng, bạn có thể muốn ['biên dịch'] (http://docs.python.org/library/re.html#re .compile) regex. –

6

này nên thực hiện công việc:

re.match(r"[^[]*\[([^]]*)\]", yourstring).groups()[0] 
+0

Tôi đoán điều này nhiều hơn OP cần thiết vì trường hợp của anh ta chỉ cần chữ và số, nhưng điều này đã làm cho tôi. Cảm ơn! – extarbags

Các vấn đề liên quan