1

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

name1 操作员 name2

其中“运算符”是 &、^ 或 | 之一

组应该是(name1 operator name2,name1,operator,name2)

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

我已经为此苦苦挣扎了一段时间,而且我有

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

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

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

4

2 回答 2

3
In [163]: re.split(r'\s*([&|^])\s*', 'name1|name2', maxsplit=1)
Out[163]: ['name1', '|', 'name2']

maxsplit=1re.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')

This has the advantage of also tripping off the whitespace at the beginning and end of the string.

The non-greediness of the first group, (.*?) allows ([&|^]) to match the first occurrence of &, |, or ^.

于 2013-03-18T17:32:01.480 回答
1

An option to remove extra spaces:

>>> re.search(r'^\s*(.+?)\s*([&|^])\s*(.+?)\s*$', ' foo | bar & lol ').groups()
('foo', '|', 'bar & lol')
于 2013-03-18T17:44:38.940 回答