正则表达式:匹配直到冒号或左括号为止的所有内容

3
我希望你能提供一个正则表达式,以获取在第一次出现字符:或字符(之前的所有内容,并可选包含空格。
取以下文本为例:
foo : bar
foo bar: baz
foo (bar): baz

预期结果:

<foo>: bar
<foo bar>: baz
<foo> (bar): baz

我尝试了这个(.*[:\(]),但是得到的结果是:
<foo :> bar
<foo bar:> baz
<foo (bar):> baz

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

我正在使用Python 3.5。

有什么想法吗?


^(.*)[:\(] 怎么样? - Jonathan Parent Lévesque
@JonathanParentLévesque:太贪心了。 - Jonathan Leffler
2个回答

6

您可以使用

^([^:(]+?)(\s*[:(])

并将其替换为<\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)

我添加了一些解释。刚刚发现我在演示中没有重命名一个变量,已经修复了。现在,所有的东西似乎都在工作。 - Wiktor Stribiżew
太完美了!谢谢! - roipoussiere

1

^[^(:]*[^(:\s]

enter image description here

此版本不会获取尾部的':'或'\s'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接