正则表达式:匹配所有内容,直到`:`或`(`

roi*_*ere 3 python regex python-3.x

我想要一个正则表达式来获取所有内容,直到第一次出现 char:或 char (,前面有一个可选的空格。

以这段文字为例:

foo : bar
foo bar: baz
foo (bar): baz
Run Code Online (Sandbox Code Playgroud)

预期的:

<foo>: bar
<foo bar>: baz
<foo> (bar): baz
Run Code Online (Sandbox Code Playgroud)

我尝试过这个(.*[:\(]),但是这给出了:

<foo :> bar
<foo bar:> baz
<foo (bar):> baz
Run Code Online (Sandbox Code Playgroud)

请参阅https://regex101.com/r/sR4hA5/1

我正在使用Python 3.5。

任何想法?

Wik*_*żew 6

您可以使用

^([^:(]+?)(\s*[:(])
Run Code Online (Sandbox Code Playgroud)

并替换为<\1>\2. 请参阅正则表达式演示

模式匹配:

  • ^- 字符串的开头
  • ([^:(]+?)- 第 1 组匹配除 和 之外的 1 个或多个字符:(但直到第一个字符为止尽可能少......
  • (\s*[:(])- 第 2 组:零个或多个空格,后跟:(

需要惰性量词+?来强制“尾随”空格落入第 2 组。

Python 3 演示

import re
p = re.compile(r'^([^:(]+?)(\s*[:(])', re.MULTILINE)
s = "foo : bar\nfoo bar: baz\nfoo (bar): baz"
result = p.sub(r"<\1>\2", s)
print(result)
Run Code Online (Sandbox Code Playgroud)