Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式中的空间_Python_Regex - Fatal编程技术网

Python 正则表达式中的空间

Python 正则表达式中的空间,python,regex,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 mat

我可以在文本中找到
:)
:(
):

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)
(16, 19)
是非单词字符,因此
\b
不起作用。您应该使用相反的
\b

r'\B:(?\)|\()\B'
如果
\b
\w
\w
之间的边界上匹配,或者反之亦然,
\b
仅在两个
\w
或两个
\w
点之间匹配。由于
和括号字符都是
\w
字符,这意味着它们必须位于另一个非单词字符旁边(或线路的起点或终点)

不过,这仍然会与其他笑脸相配

要完全排除其他笑脸,您需要同时使用负面展望和负面展望:

r'(?<![\w()]):(?\)|\()(?![\w:])'
对于更新的模式版本,您显然不介意
在前面,因此我们将其从模式前面的排除字符中删除,并将
更新为
[x::
以匹配
x
或冒号:

r'(?<![\w)])[x:](?:\)|\()(?![\w:])'

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

for match in re.finditer(r"(?:(?<=\s)|(?<=^)):[()](?=\s|$)", ":) :):( :)  :("):
    print match.span()
如果您还想匹配
x(
),它会变得更容易:

r"(?:(?<=\s)|(?<=^))[x:][()](?=\s|$)"
reEDIT:事实上,积极断言可以用消极断言来缩短,这使得它更简单:

r"(?<!\S)(?::[()]|\(x\))(?!\S)"

r”(?如果我需要添加另一个模式呢?例如,“(x);:);:(”而不是“:):::”。我需要实现另一种方法吗?@Andres:只要你能表达微笑之前不应该出现的内容,它就会起作用。在这种情况下,
x
已经是
[\w()]的一部分了应该工作得很好。我得到了<代码>引起错误,V无效表达式请复习我的问题,我编辑解释得好一点。“安德烈斯OOP,我几乎总是忘记Python不支持可变宽度查找……我修复了那个部分,我考虑了你的编辑。
for match in re.finditer(r"(?:(?<=\s)|(?<=^)):[()](?=\s|$)", ":) :):( :)  :("):
    print match.span()
r"(?:(?<=\s)|(?<=^))(?::[()]|x\))(?=\s|$)"
r"(?:(?<=\s)|(?<=^))[x:][()](?=\s|$)"
r"(?:(?<=\s)|(?<=^))(?::[()]|\(x\))(?=\s|$)"
r"(?<!\S)(?::[()]|\(x\))(?!\S)"