查找字符串中的特殊字符笑脸

时间:2019-03-05 07:09:02

标签: python regex

我目前正在用python编写程序,我必须弄清楚像:):(:-):-(这样的笑脸,如果后面跟着特殊字符和标点符号应以这种模式替换: 例如:Hi, this is good :)#应该替换为Hi, this is good :)

我已经为其创建了正则表达式模式,但是无法在我的:-)中包含这个笑脸re.compile。它认为这是一个范围。

re.sub(r"[^a-zA-Z0-9:):D)]+", " " , words)正常运行 我需要在正则表达式中添加:-)笑脸。

3 个答案:

答案 0 :(得分:1)

一种方法是使用以下模式:

(:\)|:\(|:-\)|:-\()[^A-Za-z0-9]+

此匹配 并捕获笑脸,然后立即匹配任意数量的非字母数字字符。替换只是捕获的笑脸,从而删除了非字母字符。

input = "Hi, this is good :)#"
output = re.sub(r"(:\)|:\(|:-\)|:-\()[^A-Za-z0-9]+", "\1" , input)
print(output)

Hi, this is good :)

答案 1 :(得分:1)

[^a-zA-Z0-9:):D)]模式是错误的,因为它是用于匹配字符序列的字符类。您需要为此正则表达式添加一个与char序列匹配的替代方法。

要删除标点符号列表以外的其他标点符号

re.sub(r"(:-?[()D])|[^A-Za-z0-9\s]", r"\1" , s)

或者,在Python 3.4及更高版本中,由于the re.sub bug

re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", lambda x: x.group(1) if x.group(1) else "", s)

如果确实需要避免删除逗号,请在否定的字符类中添加,

re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s)
                               ^

请参见regex demo

详细信息

  • (:-?[()D])-将:,然后是可选的-,然后是来自字符类(,{{1 }}或)(捕获D:-):-(:):(:-D之类的笑脸)
  • :D-匹配除ASCII字母,数字,逗号和空格之外的任何字符。要使其完全了解Unicode,请替换为[^A-Za-z0-9,\s]

请参见Python 3.5+ demo

(?:[^\w\s,]|_)

请参见this Python 3.4- demo

import re
s = "Hi, this is good :)#"
print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s) )
# => Hi, this is good :)

答案 2 :(得分:0)

您可以尝试\来转义特殊字符:

re.sub("[^a-zA-Z0-9:):D:\-))]+", " " , words)