正则表达式中的空间

2024-04-20 04:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)

Tags: 答案代码in文本reformatch模式
2条回答

:()非单词字符,因此\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)

如果没有其他字符,则表示没有其他可见字符,因此笑脸周围只允许有空格(包括制表符),可以使用以下内容:

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

相关问题 更多 >