python - 正则表达式 - 匹配某些模式同时排除其他模式?
问题描述
我有想要用 Python 清理的文本数据(即只保留字母数字字符)。但是,我遇到的大多数文本数据都包含表情符号。我想从非字母数字中清除文本,但仍保留 emoji。
首先,我使用emoji
Python 中的库将文本中的每个表情符号转换为特定的字符串模式,以使其可区分。已“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_]+:'
正则表达式是否可以在从匹配中排除模式的同时删除非字母数字?如果问题不清楚,请道歉。
解决方案
如果您只想删除 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
推荐阅读
- java - 如何从 SVG 字符串中获取 SVGDocument 对象?
- php - 使用 1 个表单插入多个订单
- debian - 如何解决 postfix Debian SMTP 标记为垃圾邮件?
- python - 如何使用 selenium 将 json 加载到文本框
- r - 在 data.table 中为向量中的每个值创建一列
- tensorflow - 自定义输入到 TensorFlow Hub 模块
- swift - 当成功没有价值时如何使用结果?
- c# - 有人能告诉我为什么我找到的文本可能不会被选中吗?
- python - 使用 find beautiful soup 使用 python 获取 href
- c++ - 如何在桌面应用程序中使用 WebRTC 进行语音聊天?