1

正規表現の処理方法がわかりません。例を次に示します。

string = "red\\/banana 36    monkey\\/apple 14   red\\/apple 23  red\\/horse 56  bull\\/red 67  monkey\\/red 45    bull\\/shark 89"

red/xxxx のようなものと xxxx/red のようなものだけを考慮し、カップルではなく xxxx名のみをグループ化する re.match.group() で単一の正規表現を実行したい:

私はやってみたいです:

print(match.group("beginningwithred") + " " + match.group("number")

そして取得します:

banana 36
apple 23
horse 56

次に、次のようにします。

print(match.group("endingwithred") + " " + match.group("number")

そして取得します:

bull 67
monkey 45

私の現在のコードは次のようになります:

iterator = regex.finditer(string)
for match in iterator:
    regex = re.compile('red\\\\\\\\/(?P<beginningwithred>banana|apple|horse)|(?P<endingwithred>bull|monkey)\\\\\\\\/red (?P<number>\d\d)')

しかし、それは機能しません。使用できません| グループ間と python HOWTO は役に立たない.. { }も2つの式全体を含めて試しましたが、どちらも機能しません。それほど複雑ではないはずですが、何が問題なのかわかりません。

4

2 に答える 2

3

私は完全には従いませんが、代替案の周りに非キャプチャグループが必要なようです:

(?:foo|bar|baz)

|これにより、「実際の」グループを作成せずに使用できます。


更新なぜこれが役に立たないのですか? これは正しくありませんか?

>>> s="red\\/banana 36    monkey\\/apple 14   red\\/apple 23  red\\/horse 56  bull\\/red 67  monkey\\/red 45    bull\\/shark 89"
>>> r = re.compile(r'(?:red\\/(?P<begin>\w+)|(?P<end>\w+)\\/red)\s+(?P<number>\d+)')
>>> for m in r.finditer(s):
...     print(m.groups())

('banana', None, '36')
('apple', None, '23')
('horse', None, '56')
(None, 'bull', '67')
(None, 'monkey', '45')

update2

非値を出力したいだけの場合は、次のNoneようにすることができます。

  >>> for m in r.finditer(s):
  ...     print(','.join(g for g in m.groups() if g is not None))
于 2011-08-24T21:36:32.157 に答える