正则表达式中的空格

时间:2014-05-05 19:36:09

标签: python regex

我有这段代码可以在文本中找到:):(

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)

2 个答案:

答案 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)"