在Python中从字符串中仅提取字符

40

在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
Split 做的是与您所尝试做的相反的事情 - 它会移除分隔符,而您已将 [a-zA-Z]+ 指定为分隔符,因此它被移除了。 - Nicole
4
你从哪里获取这种荒谬的数据格式? - Ignacio Vazquez-Abrams
2
尽管你选择了chown的答案,还是看看下面的sbery2A。你从哪里获取这个输入数据?它看起来像一个Python字典,只不过被引用为字符串。 - joel goldstick
7个回答

73

你可以使用re来实现,但是字符串的split方法不接受正则表达式,而是接受字符串。

以下是使用re的一种方法:

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

10

string.split()方法不支持正则表达式。 你需要使用类似这样的方法:

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

获取字符串的方法:

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

8

我认为你想要翻译所有的单词,而不是字符。

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
"

2
@julio.alegria 你没看到正则表达式前面的(?i)吗? - FailedDev
1
不知道(?i)是什么,所以才问的 :) - juliomalegria
这是一个很棒的解决方案! - Eamonn Kenny

2
你可以采用遍历字符串的方法,并使用isalpha函数来确定它是不是字母字符。如果是,你可以将其附加到输出字符串中。最初的回答。
a = "Some57 996S/tr::--!!ing"
q = ""
for i in a:
    if i.isalpha():
        q = "".join([q,i])

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
评估字符串以解析它们?昂贵且不安全。 - MK.
8
不安全?你理解ast.literal_eval()的作用吗? - Ignacio Vazquez-Abrams
1
这个答案对我来说似乎是最周到的。原始数据是一个被引用的字典,这对我来说有点奇怪。我想知道它是怎么变成这样的。但是,这里的答案处理了字典以获取元组的第一个值,即键。如果OP描述了数据的来源,那就太好了。 - joel goldstick

1

或者,如果您希望获取所有字符,无论是单词还是空格

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

打印 q 'SomeString'


0
import re
string = ''.join([i for i in re.findall('[\w +/.]', string) if i.isalpha()])

#'[\w +/.]' -> it will give characters numbers and punctuation, then 'if i.isalpha()' this condition will only get alphabets out of it and then join list to get expected result.
# It will remove spaces also.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接