删除除字内破译Python之外的标点符号

时间:2016-02-24 21:56:42

标签: python regex r

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'

1 个答案:

答案 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_]+")