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

python中用于捕获第一个运算符的正则表达式,python,regex,Python,Regex,我正在尝试分析以下模式: 名称1操作员名称2 其中“operator”是&、^或| 组应为name1运算符name2、name1、运算符name2 现在,两个名称中的任何一个都可以包含&、|或^和空格,但只有第一次出现时才会使用运算符。进一步露面将被视为name2的一部分 我已经在这方面努力了很长一段时间了,我已经做到了 \s*(\w+\s*\w*)\s*([&|^])\s*(\w+\s*\&*\w+) 看起来不太利落,也不管用。另外,如果有一个类似于str.partition

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

名称1操作员名称2

其中“operator”是&、^或|

组应为name1运算符name2、name1、运算符name2

现在,两个名称中的任何一个都可以包含&、|或^和空格,但只有第一次出现时才会使用运算符。进一步露面将被视为name2的一部分

我已经在这方面努力了很长一段时间了,我已经做到了

\s*(\w+\s*\w*)\s*([&|^])\s*(\w+\s*\&*\w+)
看起来不太利落,也不管用。另外,如果有一个类似于str.partition的函数可以使用正则表达式并将结果限制为1,那就太好了。我找不到

对正则表达式或函数有什么想法吗?谢谢

In [163]: re.split(r'\s*([&|^])\s*', 'name1|name2', maxsplit=1)
Out[163]: ['name1', '|', 'name2']
maxsplit=1会导致re.split进行最多1次匹配:

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')
这样做的好处是可以去掉字符串开头和结尾的空格

第一组的不贪婪,*?允许[&| ^]匹配第一次出现的&、|或^

maxsplit=1会导致re.split进行最多1次匹配:

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')
这样做的好处是可以去掉字符串开头和结尾的空格


第一组的不贪婪,*?允许[&| ^]匹配第一次出现的&、|或^。

删除额外空格的选项:

>>> re.search(r'^\s*(.+?)\s*([&|^])\s*(.+?)\s*$', ' foo | bar & lol ').groups()
('foo', '|', 'bar & lol')

删除额外空间的选项:

>>> re.search(r'^\s*(.+?)\s*([&|^])\s*(.+?)\s*$', ' foo | bar & lol ').groups()
('foo', '|', 'bar & lol')

很好,我们在同一时间编写了几乎相同的正则表达式,但我使用了?所以它与lone |或foo不匹配&很好,我们在同一时间编写了几乎相同的正则表达式,但我使用了?所以它不会和lone |或foo匹配&