2011-11-20 10 views
17

В Python я хочу извлечь только символы из строки.Извлечение только символов из строки в Python

Рассмотрим У меня есть следующая строка,

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

Я хочу, чтобы результат как,

output = "players year money ipod case mini" 

Я пытался расколоть рассматривать только алфавитов,

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

Но раскол не происходит.

+3

Сплит делает противоположное тому, что вы пытаетесь сделать - он удаляет delimi и вы указали '[a-zA-Z] +' как разделитель, поэтому он удален. – Nicole

+3

Откуда вы получаете этот глупый формат данных? –

+1

Хотя вы выбрали ответ chown, взгляните на sbery2A ниже. Где вы можете получить эти входные данные. Это похоже на словарь python, за исключением того, что он цитируется, чтобы сделать его строкой. –

ответ

27

Вы можете сделать это с повторно, но строковый метод раскола не принимает регулярное выражение, он принимает строку.

Heres один из способов сделать это с ре:

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

Я отлично работаю, спасибо =) – marcelosalloum

2

Как насчет этого?

>>> 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

Почему это изменяет порядок ключей? На чем оно основано? (не значение, а не в алфавитном порядке ...)? – Nicole

+2

Оценка строк для их анализа? дорогой и небезопасный. –

+7

Небезопасный? Вы понимаете, что делает 'ast.literal_eval()' делает? –

4

Я думаю, что вы хотите, чтобы все слова, а не символы.

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

Объяснение:

" 
\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

Это решение не принимает заглавные буквы, не так ли? – juliomalegria

+2

@ julio.alegria Разве вы не видите (? I) перед регулярным выражением? – FailedDev

+1

ничего не знал о '(?i) ', вот почему я спросил :) – juliomalegria

5

String.split() не принимает регулярные выражения. Вы хотите что-то вроде:

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

и получить строку:

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

Или, если вы хотите, чтобы все символы, независимо от слов или пустых пространств

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

печать д «SomeString '

Смежные вопросы