Python 正则表达式匹配除字符串外的所有
我需要找到所有匹配一个模式的字符串,除了两个给定的字符串 例如,查找除Python 正则表达式匹配除字符串外的所有,python,regex,Python,Regex,我需要找到所有匹配一个模式的字符串,除了两个给定的字符串 例如,查找除aa和bb之外的所有字母组。从这个字符串开始: -a-bc-aa-def-bb-ghij- 应返回: ('a', 'bc', 'def', 'ghij') 我尝试使用捕获4个字符串的表达式。我想我已经接近了,但是(1)它在Python中不起作用,(2)我不知道如何从搜索中排除一些字符串。(是的,我可以稍后删除它们,但我真正的正则表达式可以一次完成所有操作,我想在其中包括最后一步。) 我说它在Python中不起作用,因为我尝
aa
和bb
之外的所有字母组。从这个字符串开始:
-a-bc-aa-def-bb-ghij-
应返回:
('a', 'bc', 'def', 'ghij')
我尝试使用捕获4个字符串的表达式。我想我已经接近了,但是(1)它在Python中不起作用,(2)我不知道如何从搜索中排除一些字符串。(是的,我可以稍后删除它们,但我真正的正则表达式可以一次完成所有操作,我想在其中包括最后一步。)
我说它在Python中不起作用,因为我尝试了这个方法,期望得到完全相同的结果,但我只得到了第一组:
>>> import re
>>> re.search('-(\w.*?)(?=-)', '-a-bc-def-ghij-').groups()
('a',)
我尝试过使用反向前瞻,但找不到适用于这种情况的有效解决方案。您需要使用反向前瞻来限制更通用的模式,并使用
re.findall
来查找所有匹配项
使用
或者-如果连字符之间的值可以是除连字符以外的任何字符,请使用否定字符类[^-]
:
res = re.findall(r'-(?!(?:aa|bb)-)([^-]+)(?=-)', s)
这是你的电话号码
详细信息:
-连字符-
-如果在第一个连字符后有(?!(?:aa | bb)-)
或aa-
,则不应返回匹配项bb-
-组1(此值将由(\w+)
调用返回)捕获1个或多个单词字符或re.findall
-1个或多个字符,而不是[^-]+
-
-字符后面必须有一个(?=-)
。这里需要使用前视以确保重叠匹配(因为此连字符将是下一个匹配的起点)-
你可以利用消极的表情 比如说,
>>> re.findall(r'-(?!aa|bb)([^-]+)', string)
['a', 'bc', 'def', 'ghij']
匹配-
-
负前瞻,检查(?!aa | bb)
后面是否没有-
或aa
bb
只匹配一个或多个字符,而不是([^-]+)
-
编辑 上述正则表达式与以
aa
或bb
开头的正则表达式不匹配,例如-aabc-
。为了解决这个问题,我们可以在lookaheads中添加-
,如下所示:
>>> re.findall(r'-(?!aa-|bb-)([^-]+)', string)
尽管要求使用正则表达式解决方案,但我认为,使用更简单的python函数,即字符串拆分和过滤,可以更轻松地解决此问题:
input_list = "-a-bc-aa-def-bb-ghij-"
exclude = set(["aa", "bb"])
result = [s for s in input_list.split('-')[1:-1] if s not in exclude]
此解决方案的另一个优点是,
result
也可以转换为生成器,并且不需要显式构造结果列表 您想要-搜索
只应返回第一个匹配:)仅供参考:(?!aa | bb)
前瞻禁止以aa
或bb
开头的匹配。比如说,aacn
@WiktorStribiżew有效点。我对答案进行了编辑。谢谢你指出:)是的,我只是认为结尾的-
实际上是必需的-只是从OP输入字符串判断。如果最后没有-
,您的正则表达式将返回匹配项,而我的正则表达式不会返回匹配项。这一点不清楚,但我想我投了反对票。@WiktorStribiżew我想OP的意思是说,-
在最后是必需的。这使得模式比没有的模式更简单。如果需要在末尾加连字符,则需要在末尾加(?=-)
。我将它保留在我的模式中。我也将在这里添加这句话:我认为最后一个前瞻是必需的,因为最后一个匹配只有在后面跟有-
时才有效。这是从OP字符串推导出来的,所以不确定。
>>> re.findall(r'-(?!aa-|bb-)([^-]+)', string)
input_list = "-a-bc-aa-def-bb-ghij-"
exclude = set(["aa", "bb"])
result = [s for s in input_list.split('-')[1:-1] if s not in exclude]