我正在尝试编写正则表达式来匹配可能包含或不包含两个标记的字符串.我需要表达式返回字符串的所有五个元素,具体取决于它们是否存在,但是当我使标记可选时,通配符似乎吞噬它们:
输入可以是:
text{a}more{b}words
{a}text{b}test
text
text{b}text
text{b}
text{a}text
Run Code Online (Sandbox Code Playgroud)
等等.唯一保证的是,如果它们存在,<a>
它将始终<b>
存在.
我的表达现在看起来如下:
^(.*?)(\{a\})?(.*?)(\{b\})?(.*?)$
Run Code Online (Sandbox Code Playgroud)
不幸的是,无论标签是否存在,最终都会将所有文本丢入最后一组.有没有办法让他们贪心,但保持他们可选?re.findall
不幸的是,似乎没有帮助.
任何帮助将不胜感激!:)
尝试以下正则表达式:^(.*(?={a})|.*?)({a})?(.*(?={b})|.*)({b})?(.*?)$
import re
inputs = ['{a}text{b}test', 'text', 'text{b}text', 'text{b}', 'text{a}text']
p = re.compile(r"^(.*(?={a})|.*?)({a})?(.*(?={b})|.*)({b})?(.*?)$")
for input in inputs:
print p.match(input).groups()
Run Code Online (Sandbox Code Playgroud)
输出:
('', '{a}', 'text', '{b}', 'test')
('', None, 'text', None, '')
('', None, 'text', '{b}', 'text')
('', None, 'text', '{b}', '')
('text', '{a}', 'text', None, '')
Run Code Online (Sandbox Code Playgroud)