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/