Python:如何对字符串的字母进行排序,保留一些字符?

时间:2016-12-03 17:44:20

标签: python string

我已经问过这个问题了,但这是Ruby,现在轮到了Python! 我想对字符串的单词进行排序,保留非字母数字字符,例如:

"hello, sally! seen 10/dec/2016 => ehllo, allsy! eens 01/cde/0126"

根据我之前收到的答案,我试过:

def sortThisList(listWords):
    for word in listWords:
        print(re.sub('\W+', sortStr(word), word)) #Error

def sortStr(word):
    return "".join(sorted(list(word)))

但会弹出此错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in sortItAll
  File ".../lib/python3.6/re.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

<击>

不再了,谢谢^^。 但它仍然没有正确排序。

1 个答案:

答案 0 :(得分:3)

您正在尝试将正则表达式应用于整个列表,而不是单个词:

for word in textInaList:  # textInaList presumably is a list
    print(re.sub('\W+', sortStr(word), textInaList))
#    you pass that list into re.sub(): ^^^^^^^^^^^

接下来,您希望传入sortStr 函数,如果您希望将其用于每次替换,并让该函数处理匹配对象。您还需要替换\w+(单词字符),非单词字符:

def sortStr(match):
    return "".join(sorted(match.group()))

print(re.sub('\w+', sortStr, sentence))

当你将一个函数作为第二个参数传递给re.sub()时,会在第三个参数中找到的每个匹配调用它,传入match object;调用match.group()会返回匹配的文本(在本例中为单个单词)。然后将返回值用作替换值。

演示:

>>> import re
>>> def sortStr(match):
...     return "".join(sorted(match.group()))
...
>>> sentence = "hello, sally! seen 10/dec/2016"
>>> re.sub('\w+', sortStr, sentence)
'ehllo, allsy! eens 01/cde/0126'