Python 匹配除表情符号以外的所有符号

Python 匹配除表情符号以外的所有符号,python,ruby,regex,ruby-1.8.7,Python,Ruby,Regex,Ruby 1.8.7,我使用Ruby 1.8.7 我有一个在Ruby 1.8.7中有效的正则表达式来匹配所有表情 /\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_^?[-DOo0S*Ppb3c:;\/\\|)(}{\]><]\)?|\(/ 指— 我怎样才能做到这一点呢?我认为这是一项很难用regex完成的任务 我的第一个想法是在匹配符号之前使用否定的前瞻断言(匹配表情),如 (?!\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_?[-DOo0S*Ppb3c:

我使用Ruby 1.8.7 我有一个在Ruby 1.8.7中有效的正则表达式来匹配所有表情

/\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_^?[-DOo0S*Ppb3c:;\/\\|)(}{\]><]\)?|\(/
指—


我怎样才能做到这一点呢?

我认为这是一项很难用regex完成的任务

我的第一个想法是在匹配符号之前使用否定的前瞻断言(匹配表情),如

(?!\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_?[-DOo0S*Ppb3c:;\/\\|)(}{\]><]\)?|\()[:;._()]
# works like "if no emoticon at this position, then match a symbol"
基本思想是:字符
=:通常用作表情符号的眼睛。因此,我们必须断言在左边或右边没有(可选的)鼻子
o*,-
,也没有嘴
({}[]| PpD\/OSso0
。更糟糕的是,lookbehind断言不允许使用量词,因此重复的
(?| D])
(?|][o-])
(其中一个匹配嘴巴,而另一个匹配嘴巴和鼻子)

构建与所有特殊角色匹配的完整模式需要付出大量的努力,而且可能会非常漫长和混乱

如果您不必使用纯正则表达式来执行此操作,我建议使用正则表达式从字符串中删除所有表情符号,然后查找所有剩余符号


另外,我制作这个图案是为了匹配表情,它与旋转的笑脸(如
:x
:|
(:
)等)配合得相当好。它也应该比你的图案产生更少的误报

更新#2:图案不再与数字匹配。增加了对东方笑脸的支持。杂项小改进。现在匹配了相当数量的数字


(?!\d\d)(?![a-zA-Z]{2})(?:(?:>?[:;=%8BXx][''']?[-o*^っ]?(?:(?P[()Il])(?P=嘴)*.[\/0\]o\\D\[PpSs{}ccox*3@222}bL&?$))(?:[()\{}/\]DOo0;SsXxlI*@q][o*,]?[''].[:=8;%Xx]你是对的!我没有正确地向后看。谢谢!它匹配了一些数字,如08和80。我该如何处理它?你是对的。我想最简单的解决方法是使用前瞻断言。我将用新模式更新我的答案。
= .) () & . . .
(?!\|?>?[:*;Xx8=<(%)D]-?'?,?o?\_?[-DOo0S*Ppb3c:;\/\\|)(}{\]><]\)?|\()[:;._()]
# works like "if no emoticon at this position, then match a symbol"
(?<![(){}\[\]<>|D])(?<![(){}\[\]<>|][o-])[=:;](?!'?[o*,-]?[(){}\[\]<>|PpD\\\/OSso0])
(?!\d\d)(?![a-zA-Z]{2})(?:(?:>?[:;=%8BXx]['‘’]?[-o*,^っ]?(?:(?P<mouth>[()|Il])(?P=mouth)*|[\/0\]o\\D\[PpSs<>{}CcOXx*3@ÞþbL&?$#]))|(?:[()\\{}\/<\[>\]DOo0|SsXxlI*@q][-o*,]?['‘’]?[:=8;%Xx]<?))|(?P<head>\()?(?:(?P<eye>[<>v*.^~=ಠ-])?[_.-](?P=eye)|[o0O][_.-][o0O]|>[_.-]?<)['‘’]?(?(head)\))|xD|XD|XP|xP|DX|<3|\^\^|\\o\/|o\/|\\o