Python 在字符串中查找特殊字符smiley

Python 在字符串中查找特殊字符smiley,python,regex,Python,Regex,我目前正在用python编写一个程序,在这个程序中,我必须找出如下笑脸::),:(,:-),:-()如果后跟特殊字符,则应替换它,并且在这种模式中应替换标点: 例如:Hi,这很好:)应该替换为Hi,这很好:) 我已经为sub-it创建了正则表达式模式,但无法将此笑脸包含在我的重新编译中。它正在考虑将其作为一个范围 re.sub(r“[^a-zA-Z0-9:):D)]+,”,单词) 我需要将:-)smiley添加到正则表达式中。您可以使用\对特殊字符进行转义,请尝试: re.sub("[^a-zA

我目前正在用python编写一个程序,在这个程序中,我必须找出如下笑脸:
:)
:(
:-)
:-(
)如果后跟特殊字符,则应替换它,并且在这种模式中应替换标点: 例如:
Hi,这很好:)
应该替换为
Hi,这很好:)

我已经为sub-it创建了正则表达式模式,但无法将此笑脸包含在我的
重新编译中。它正在考虑将其作为一个范围

re.sub(r“[^a-zA-Z0-9:):D)]+,”,单词)

我需要将
:-)
smiley添加到正则表达式中。

您可以使用
\
对特殊字符进行转义,请尝试:

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

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

(:\)|:\(|:-\)|:-\()[^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 :)
[^a-zA-Z0-9:):D)]
模式是错误的,因为它是用于匹配字符序列的字符类。您需要在此正则表达式中添加一个与字符序列匹配的替代项

要删除除特定笑脸列表之外的任何标点符号,您可以使用

re.sub(r"(:-?[()D])|[^A-Za-z0-9\s]", r"\1" , s)
或者,在Python 3.4及更早版本中,由于以下原因:

如果确实需要避免删除逗号,请将
添加到求反字符类中:

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

详细信息

  • (:-?[()D])
    -匹配并捕获到组1 a
    ,然后是可选的
    -
    ,然后是字符类中的单个字符:
    D
    (这捕获了类似于
    :-)
    :-(
  • [^A-Za-z0-9\s]
    -匹配除ASCII字母、数字、逗号和空格以外的任何字符。要使其完全支持Unicode,请替换为
    (?:[^\w\s,]|)
见:

见:


请提供演示和解释。请注意,模式的主要问题是它包含一个字符类,您在其中添加了一系列要匹配的模式,但它不是这样工作的。你需要在这里分组。这不是无耻地推广我的答案,但你也可以检查我的答案,看看它是否对你有用。@WiktorStribiżew它工作得很好!但是Python2中的同一个正则表达式模式抛出了一个错误。这是一个完美的正则表达式模式,它应该只识别smileys,而不是“)”和“:”。Python2在使用该正则表达式模式时抛出了一个错误。它将仅在Python3上工作?@noobster是的,它不会在Python3.5之前的任何python上工作,因为该问题已经解决。请使用早期版本。@诺贝斯特很高兴它能起作用,请考虑接受这个答案。
re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s)
                               ^
import re
s = "Hi, this is good :)#"
print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", r"\1" , s) )
# => Hi, this is good :)
import re
s = "Hi, this is good :)#"
print( re.sub(r"(:-?[()D])|[^A-Za-z0-9,\s]", lambda x: x.group(1) if x.group(1) else "", s) )
# => Hi, this is good :)