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

これには、文字列の先頭と末尾の空白も取り除けるという利点があります。

最初のグループの非貪欲性により、 、、またはの最初の出現に一致する(.*?)ことができます。([&|^])&|^

于 2013-03-18T17:32:01.480 に答える
1

余分なスペースを削除するオプション:

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