【问题标题】:finding speical character smileys in a string在字符串中查找特殊字符笑脸
【发布时间】:2019-03-05 07:09:01
【问题描述】:

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

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

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

【问题讨论】:

  • check my answer,提供演示和解释。请注意,您的模式的主要问题是它包含一个字符类,您在其中添加了要匹配的 a sequence of patterns,但它不是那样工作的。您需要在这里进行分组。
  • 这不是对我的答案的无耻宣传,但您也可以查看我的答案,看看它是否适合您。
  • @WiktorStribiżew 它完美运行!但是 python 2 中的相同正则表达式模式会引发错误。

标签: python regex


【解决方案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 :)

【讨论】:

    【解决方案2】:

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

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

    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(这会捕获像 @ 这样的笑脸987654338@, :-(, :), :(, :-D, :D)
    • [^A-Za-z0-9,\s] - 匹配除 ASCII 字母、数字、逗号和空格之外的任何字符。要使其完全支持 Unicode,请替换为 (?:[^\w\s,]|_)

    Python 3.5+ 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 :)
    

    this Python 3.4- demo:

    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 :)
    

    【讨论】:

    • 这是一个完美的正则表达式模式,它应该只识别笑脸而不是“)”和“:”。Python2 在使用这个正则表达式模式时会抛出一个错误。它只能在 python 3 上工作?跨度>
    • @noobster 是的,它不适用于解决问题的 Python 3.5 之前的任何 Python。将rextester.com/VKR32235 与早期版本一起使用。
    • @noobster 很高兴它有效,然后请考虑接受答案。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 2023-03-24
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多