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