2011-11-20 39 views
17

Trong Python, tôi chỉ muốn trích xuất các ký tự từ một chuỗi.Chỉ trích xuất các ký tự từ một chuỗi trong Python

Xem xét Tôi có chuỗi sau,

input = "{('players',): 24, ('year',): 28, ('money',): 19, ('ipod',): 36, ('case',): 23, ('mini',): 46}" 

Tôi muốn kết quả như,

output = "players year money ipod case mini" 

Tôi cố gắng để chia xem xét chỉ có bảng chữ cái,

word1 = st.split("[a-zA-Z]+") 

Nhưng sự chia rẽ không xảy ra.

+3

Chia ngược lại với những gì bạn đang cố gắng làm - nó xóa delimi ters, và bạn đã chỉ định '[a-zA-Z] +' làm dấu phân tách, vì vậy nó được loại bỏ. – Nicole

+3

Bạn nhận định dạng dữ liệu ngớ ngẩn này từ đâu? –

+1

Mặc dù bạn đã chọn câu trả lời của chown, hãy xem sbery2A bên dưới. Bạn lấy dữ liệu đầu vào này ở đâu. Nó trông giống như một từ điển python, ngoại trừ nó được trích dẫn để làm cho nó thành một chuỗi. –

Trả lời

27

Bạn có thể làm điều đó với re, nhưng phương pháp chuỗi chia doesnt mất một regex, phải mất một chuỗi.

Heres một cách để làm điều đó với lại:

import re 
word1 = " ".join(re.findall("[a-zA-Z]+", st)) 
+0

Tôi làm việc perfetcly, nhờ =) – marcelosalloum

2

Còn việc này thì sao?

>>> import ast 
>>> " ".join([k[0] for k in ast.literal_eval("{('players',): 24, ('year',): 28, ('money',): 19, ('ipod',): 36, ('case',): 23, ('mini',): 46}").keys()]) 
'case mini year money ipod players' 
+1

Tại sao nó thay đổi thứ tự của các phím? Nó dựa trên cái gì? (không phải giá trị, không phải chữ cái ...)? – Nicole

+2

đánh giá các chuỗi để phân tích cú pháp chúng? tốn kém và không an toàn. –

+7

Không an toàn? Bạn có hiểu những gì 'ast.literal_eval()' không? –

4

Tôi nghĩ rằng bạn muốn tất cả các từ, không phải ký tự.

result = re.findall(r"(?i)\b[a-z]+\b", subject) 

Giải thích:

" 
\b  # Assert position at a word boundary 
[a-z] # Match a single character in the range between “a” and “z” 
    +  # Between one and unlimited times, as many times as possible, giving back as needed (greedy) 
\b  # Assert position at a word boundary 
" 
+0

giải pháp này không chấp nhận chữ hoa, phải không? – juliomalegria

+2

@ julio.alegria Bạn không thấy (? I) trước regex? – FailedDev

+1

không biết gì về '(?i) ', đó là lý do tại sao tôi hỏi :) – juliomalegria

5

String.split() không mất biểu thức thông thường. Bạn muốn một cái gì đó như:

re.split("[^a-zA-Z]*", "your string") 

và để có được một chuỗi:

" ".join(re.split("[^a-zA-Z]*", "your string")) 
1

Hoặc nếu bạn muốn tất cả các ký tự không phân biệt chữ hoặc khoảng trống

a = "Some57 996S/tr::--!!ing" 
    q = "" 
    for i in a: 
     if i.isalpha(): 
      q = "".join([q,i]) 

in q 'SomeString '

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