Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,我需要找到所有匹配一个模式的字符串,除了两个给定的字符串 例如,查找除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-
    ,则不应返回匹配项
  • (\w+)
    -组1(此值将由
    re.findall
    调用返回)捕获1个或多个单词字符
    [^-]+
    -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]