R gsub("[^[:alnum:]['-]", " ", my_string)中已经有一个接近的answer,但是在Python中不起作用:

my_string = 'compactified on a calabi-yau threefold @ ,.'
re.sub("[^[:alnum:]['-]", " ", my_string)

给出'compactified on a calab yau threefold @ ,.'
因此,它不仅删除了单词内的破折号,而且还删除了破折号之前单词的最后一个字母。而且它不会删除标点符号

预期结果(不带标点的字符串,但单词内的破折号):'compactified on a calabi-yau threefold'

最佳答案

R根据perl选项(或使用的函数)使用TRE(POSIX)或PCRE正则表达式引擎。 Python使用经过修改的,比Perl更差的版本作为re库。 Python不支持POSIX字符类,例如与alpha(字母)和num(数字)匹配的 [:alnum:]

在Python中,可以将[:alnum:]替换为[^\W_](或仅ASCII的[a-zA-Z0-9]),并将否定的[^[:alnum:]]替换为[\W_](仅ASCIIt的[^a-zA-Z0-9])。
[^[:alnum:]['-]匹配除字母数字(字母或数字),['-之外的任何1个符号。 意味着您引用的R问题没有提供正确的答案

您可以使用following solution:

import re
p = re.compile(r"(\b[-']\b)|[\W_]")
test_str = "No -  d'Ante compactified on a calabi-yau threefold @ ,."
result = p.sub(lambda m: (m.group(1) if m.group(1) else " "), test_str)
print(result)

(\b[-']\b)|[\W_] regex匹配并捕获单词内-',我们通过检查捕获组是否匹配并用re.sub重新插入捕获组,将它们恢复为m.group(1),其余的(所有非单词字符和下划线)都被替换为空格。

如果要用一个空格删除非单词字符序列,请使用
p = re.compile(r"(\b[-']\b)|[\W_]+")

关于python - 用空格替换单词内破折号以外的标点符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35613990/

10-11 19:38
查看更多