1

私は正規表現の専門家ではありません。したがって、私のスキルセットは打ち負かされます。次のテキストを検討してください。

[SectionTitle0]
...
Name: NameOfTechC
...

[SectionTitle1]
...
Name: NameOfZoneC
...

正規表現を使用して Tech-C と Zone-C の名前を抽出することに興味があります。これは config-section-party のように見えますが、ライブラリを使用して構成を解析する場合があります。しかし、この抽出物はさらに大きなファイルの一部です。結果として、config-parsers はここでは機能しません。

現在、 で名前を抽出していName:\s?(.+)ます。Python で使用re.findallすると、両方の名前を含むリストが返されます。のようなものを使用する方法はありますか

TechC_name: regex1
ZoneC_name: regex2

Tech-C名またはZone-C名のリストを返しますか?

【更新】
いくつかの点を明確にしたい。「名前:」の位置は固定されていないため、エントリの前後に同じポイントがリストされる可能性があります。質問を更新しました。

SectionTitle0 (以前の 'Tech-C') と SectionTitle1 (以前の 'Zone-C') が同一である場合があることを認識しました。そのため、少し複雑になります。「Name:」の最初の出現に適合する正規表現と、「Name:」の 2 番目 (または n 番目) の出現に一致する正規表現を構築する方法があるかもしれません。

4

3 に答える 3

0

次の形式で簡単に出力を取得できます。-

[(section1, name1), (section2, name2), ...]

正規表現の実装に従うことによって:-

import re
re.findall(r"\[(\S+)\]\nName: (\w+)", t)

出力は次のようになります:-

[('Tech-C', 'NameOfTechC'), ('Zone-C', 'NameOfZoneC')]
于 2012-08-31T08:10:26.787 に答える
0

正規表現:

\[([^\]]*)\][\r\n]+(?:(?!Name:).*[\r\n]+)*?Name:\s*(.*)

\1セクションのタイトルと名前をグループとに効率的にキャプチャし\2ます。

実装

import re

data  = """[SectionTitle0]
...
Name: NameOfTechC
...

[SectionTitle1]
...
Name: NameOfZoneC
...
"""

regexStr = r'\[([^\]]*)\][\r\n]+(?:(?!Name:).*[\r\n]+)*?Name:\s*(.*)'
regex    = re.compile(regexStr)
regex.findall(data)
于 2012-08-31T13:52:45.307 に答える
0

探している 2 つの正規表現は次のとおりです。

TechC_name:

re.findall(r"\[Tech-C\]\nName: (.*?)\n", s)

ZoneC_name:

re.findall(r"\[Zone-C\]\nName: (.*?)\n", s)
于 2012-08-31T07:48:36.530 に答える