我有这段代码可以在文本中找到:)
和:(
:
for match in re.finditer(r':\)|:\(', ":) :):( :) :("):
print match.span()
并给我这个答案:
(0, 2)
(3, 5)
(5, 7)
(8, 10)
(12, 14)
它有效,但是我需要它只向我展示那个单独的单词(旁边没有其他字符)所以答案是:
(0, 2)
(8, 10)
(12, 14)
我尝试添加\b
但没有回答
这是将(x)添加到模式
的情况for match in re.finditer(r'(?<![\w()]):(?:\)|\()(?![\w:])', ":) :):( :) :( (x)"):
print match.span()
所示:
(0, 2)
(8, 10)
(12, 14)
我想要
(0, 2)
(8, 10)
(12, 14)
(16, 19)
答案 0 :(得分:3)
:
,(
和)
是非单词字符,因此\b
无效。你可以使用反向\B
:
r'\B:(?\)|\()\B'
\b
在\w
和\W
之间的边界匹配,反之亦然,\B
只匹配两个\w
或两个\W
}点。由于:
和括号中的字符都是\W
个字符,这意味着它们必须位于另一个非单词字符(或行的开头或结尾)旁边。
但是,它仍会匹配其他表情符号。
要完全排除其他表情,您需要同时使用负面前瞻和负面观察:
r'(?<![\w()]):(?\)|\()(?![\w:])'
这说:
(?<![\w()])
:笑脸之前没有字符或括号(字符串的开头很好)(?![\w:])
:笑脸后没有字符或冒号(字符串结尾很好)演示:
>>> for match in re.finditer(r'(?<![\w()]):(?:\)|\()(?![\w:])', ":) :):( :) :("):
... print match.span()
...
(0, 2)
(8, 10)
(12, 14)
对于您更新的模式版本,您显然不介意(
是否在前面,因此我们会从模式前面的排除字符中删除它,并将:
更新为[x:]
匹配x
或冒号:
r'(?<![\w)])[x:](?:\)|\()(?![\w:])'
演示:
>>> for match in re.finditer(r'(?<![\w)])[x:](?:\)|\()(?![\w:])', ":) :):( :) :( (x)"):
... print match.span()
...
(0, 2)
(8, 10)
(12, 14)
(16, 18)
答案 1 :(得分:3)
如果没有其他角色,则表示没有其他可见角色,因此笑脸周围唯一允许的角色是空格(包括制表符),您可以使用以下内容:
for match in re.finditer(r"(?:(?<=\s)|(?<=^)):[()](?=\s|$)", ":) :):( :) :("):
print match.span()
(?:(?<=\s)|(?<=^))
确保在笑脸之前有空白字符或行的开头,
:[()]
匹配:
后跟(
或)
(?=\s|$)
确保在笑脸之后有空白字符或行尾。
如果您还想要与笑脸x)
相匹配,可以使用:
r"(?:(?<=\s)|(?<=^))(?::[()]|x\))(?=\s|$)"
如果你想匹配x(
,它会变得容易一些:
r"(?:(?<=\s)|(?<=^))[x:][()](?=\s|$)"
[ ... ]
是一个角色类,你不需要逃避那里的东西。警惕-
和^
的展示位置,因为这两个展示在角色类中具有特殊含义。
编辑:似乎我得到了错误的额外笑脸x)为此(意为:)
,:(
和(x)
),它会有点像:
r"(?:(?<=\s)|(?<=^))(?::[()]|\(x\))(?=\s|$)"
reEDIT:实际上,正面断言可以用负面断言缩短,这样可以更简单:
r"(?<!\S)(?::[()]|\(x\))(?!\S)"