首页 > 解决方案 > 正则表达式 - 匹配某些模式同时排除其他模式?

问题描述

我有想要用 Python 清理的文本数据(即只保留字母数字字符)。但是,我遇到的大多数文本数据都包含表情符号。我想从非字母数字中清除文本,但仍保留 emoji

首先,我使用emojiPython 中的库将文本中的每个表情符号转换为特定的字符串模式,以使其可区分。已“demojized”(库中的文字函数)的表情符号示例如下所示:

':smiley_face:' # a "demojized" emoji.

滚动浏览数据后,我发现这些表情符号(曾经“demojized”)表现出相同的模式,在正则表达式中似乎是

':[a-z_]+:' # regex for matching emojis.

好的,所以我知道表情符号的模式,我可以从我拥有的文本数据中提取每个表情符号。问题是,我想在不同时更改表情符号模式的情况下从非字母数字中清除文本数据。我最初尝试清理数据:

>>> text = 'Wow.. :smiley_face: this is delicious!' # A string containing emoji
>>> cleaned_text = re.sub('[^a-zA-Z0-9]+',' ',text) # regex to keep only alphanumerics
>>> print(cleaned_text)
Wow smiley face this is delicious

显然这不是我想要的输出。我想保持 emoji 文字完整,如下图:

'Wow :smiley_face: this is delicious' # Desired output

到目前为止,我已经研究了诸如前瞻断言之类的东西,但无济于事。':[a-z_]+:'正则表达式是否可以在从匹配中排除模式的同时删除非字母数字?如果问题不清楚,请道歉。

标签: pythonregextext-mining

解决方案


如果您只想删除 colon-word(s)-colon上下文中除冒号和下划线之外的所有特殊字符,您可以使用

re.sub(r'(:[a-z_]+:)|[^\w\s]|_', r'\1', text)

请参阅正则表达式演示详情

  • (:[a-z_]+:) - 捕获组 1 ( \1): :, 一个或多个小写 ASCII 字母或_, 和:
  • |- 或者
  • [^\w\s]|_- 除单词和空格字符或 a 以外的任何字符_(它是单词字符,因此需要添加它作为替代)。

请参阅Python 演示

import re
text = 'Wow.. :smiley_face: this is delicious!' # A string containing emoji
print( re.sub(r'(:[a-z_]+:)|[^\w\s]|_', r'\1', text) )
# => Wow :smiley_face: this is delicious

推荐阅读