我已经问过这个问题了,但这是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
击> <击> 撞击>
不再了,谢谢^^。 但它仍然没有正确排序。
答案 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'