python中的正则表达式捕获第一个运算符

时间:2013-03-18 17:29:16

标签: python regex

我正在尝试解析以下模式:

  

name1 operator name2

其中'operator'是&,^或|

之一

这些群组应为(name1 operator name2,name1,operator,name2)

现在,任一名称都可以包含&,| or ^和空格,但只有第一次出现才会成为运算符。进一步的出现将被视为name2的一部分。

我已经熬了很久了,我已经

\s*(\w+\s*\w*)\s*([&|^])\s*(\w+\s*\&*\w+)

看起来不是很脆弱,也不起作用。此外,如果有一个类似于str.partition()的函数可以使用正则表达式并将结果限制为1,那就太棒了。我找不到一个。

正则表达式或函数的任何想法?感谢

2 个答案:

答案 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')