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'
答案 0 :(得分:5)
R使用TRE(POSIX)或PCRE正则表达式引擎,具体取决于perl
选项(或使用的函数)。 Python使用经过修改的,更差的类Perl版本作为re
库。 Python不支持 POSIX字符类,因为 [:alnum:]
匹配 alpha (字母)和 num (位数)。
在Python中,[:alnum:]
可以替换为[^\W_]
(或仅限ASCII [a-zA-Z0-9]
),而[^[:alnum:]]
替换为[\W_]
([^a-zA-Z0-9]
}仅ASCII版本。)
[^[: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)
来恢复它们1}},其余的(所有非单词字符和下划线)只是用空格替换。
如果要删除一个空格的非单词字符序列,请使用
p = re.compile(r"(\b[-']\b)|[\W_]+")