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。
任何想法?
您可以使用
^([^:(]+?)(\s*[:(])
Run Code Online (Sandbox Code Playgroud)
并替换为<\1>\2
. 请参阅正则表达式演示。
模式匹配:
^
- 字符串的开头([^:(]+?)
- 第 1 组匹配除 和 之外的 1 个或多个字符:
,(
但直到第一个字符为止尽可能少......(\s*[:(])
- 第 2 组:零个或多个空格,后跟:
或(
。需要惰性量词+?
来强制“尾随”空格落入第 2 组。
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)