我正在尝试解析以下模式:
name1 operator name2
其中'operator'是&,^或|
之一这些群组应为(name1 operator name2,name1,operator,name2)
现在,任一名称都可以包含&,| or ^
和空格,但只有第一次出现才会成为运算符。进一步的出现将被视为name2的一部分。
我已经熬了很久了,我已经
了\s*(\w+\s*\w*)\s*([&|^])\s*(\w+\s*\&*\w+)
看起来不是很脆弱,也不起作用。此外,如果有一个类似于str.partition()
的函数可以使用正则表达式并将结果限制为1,那就太棒了。我找不到一个。
正则表达式或函数的任何想法?感谢
答案 0 :(得分:3)
In [163]: re.split(r'\s*([&|^])\s*', 'name1|name2', maxsplit=1)
Out[163]: ['name1', '|', 'name2']
maxsplit=1
会导致re.split
最多匹配一次:
In [164]: re.split(r'\s*([&|^])\s*', 'name1|nam^e2', maxsplit=1)
Out[164]: ['name1', '|', 'nam^e2']
你也可以使用非贪婪的搜索:
In [184]: re.search(r'\s*(.*?)\s*([&|^])\s*(.*?)\s*', 'name1 | nam^e2').groups()
Out[184]: ('name1', '|', 'nam^e2')
这样做的好处是还可以在字符串的开头和结尾处跳过空格。
第一组的非贪婪(.*?)
允许([&|^])
匹配第一次出现的&
,|
或^
。
答案 1 :(得分:1)
删除多余空格的选项:
>>> re.search(r'^\s*(.+?)\s*([&|^])\s*(.+?)\s*$', ' foo | bar & lol ').groups()
('foo', '|', 'bar & lol')