正则表达式:除了某些模式之外的所有东西

时间:2015-04-16 03:57:13

标签: regex regex-negation

我有一个字符串:

  

foo bar
  foo1#9 0x103806f4 bar1
  foo2#10 0x0f6dd704 bar2
  foo3 bar3

我尝试过以下方法:

  

^((?!#[\ d] {1,2} 0x [0-9a-f] {8})。)* $

得到

  

foo bar
  foo3 bar3


  

^((?!#[\ d] {1,2} 0x [0-9a-f] {8})。)*

得到

  

foo bar
  foo1
  foo2的
  foo3 bar3

但我想要的是

  

foo bar
  foo1 bar1
  foo2 bar2
  foo3 bar3

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

您需要更换而不是按顺序匹配才能获得所需的输出。

\s*#\d{1,2} 0x[0-9a-f]{8}

使用上面的正则表达式,然后用空字符串替换匹配。

DEMO

答案 1 :(得分:3)

如果您想要开头和结尾非空白字符,使用否定前瞻不会完成任务。您可以按如下方式匹配预期输出:

^(\S+).*?(\S+)$

然后,您可以使用首选语言合并匹配结果:示例...

>>> import re
>>> s = '''foo bar
foo1 #9 0x103806f4 bar1
foo2 #10 0x0f6dd704 bar2
foo3 bar3'''
...
>>> for m in re.finditer(r'(?m)^(\S+).*?(\S+)$', s):
...     print(" ".join(m.groups()))

foo bar
foo1 bar1
foo2 bar2
foo3 bar3

不要使用正则表达式,而是考虑拆分字符串并将索引连接在一起。