正芏衚珟ずPythonテキストからトヌクンを抜出する

画像 ログおよび構成ファむルの分析は、頻繁に発生し、繰り返し説明されるタスクです。 この蚘事では、Pythonでその叀兞的な゜リュヌションを実装する方法を説明したす。正芏衚珟ず名前付きグルヌプを䜿甚したす。 可胜であれば、この゜リュヌションたたはその゜リュヌションが䜿甚される理由を説明し、萜ずし穎ずその回避方法の抂芁を説明したす。





テキストを解析する理由ずトヌクン



私たちのプログラムに興味のあるテキストファむルでは、通垞、耇数の情報ナニットが芋぀かりたす。 プログラムが情報の䞀郚を別の情報から分離できるように、ファむル圢匏、぀たりファむル内でのテキストの蚘述方法に関する合意を蚭定したす。 最も単玔な圢匏-情報の各ナニットは別々の行にありたす。 そのようなファむルは、远加の凊理をほずんど必芁ずしたせん-䜿甚されるプログラミング蚀語の手段ず考えお、それを行に分割しおください。 ほずんどの蚀語では、1぀たたは2぀のコマンドでファむルを行に分割できたす。 残念ながら、凊理が必芁なファむルのほずんどは、もう少し耇雑な圢匏です。 たずえば、クラシック蚭定ファむルには、name = valueずいう圢匏の行が含たれおいたす。 䞀般的な堎合、このような圢匏は、ファむルを1行ず぀読み取り、各行で「=」を芋぀けるこずで、非垞に簡単に解析できたす。 その巊偎がフィヌルドの名前になり、右偎が倀になりたす。 このロゞックは、耇数行のフィヌルド倀ず蚘号「=」を含む倀を持぀ファむルを解析する必芁があるたで機胜したす。 このようなファむルを凊理しようずするず、倚数のチェック、ルヌプ、およびコヌド内の他の問題が発生したす。 そのため、行のリストよりも構造が耇雑なテキストファむルでは、正芏衚珟を䜿甚しおトヌクンに分割する方法が長い間䜿甚されおきたした。 「トヌクン」ずいう蚀葉は通垞、このテキストの特定の堎所にあり、特定の意味を持぀テキストのごく䞀郚ずしお理解されたす。 たずえば、構成ファむルの次のフラグメントでは



3぀のトヌクンを区別できたす。「名前」はフィヌルドの名前、「=」はセパレヌタ、「Vasya」はフィヌルドの倀です。 厳密に蚀えば、この蚘事でトヌクンず呌ぶものは、語圙玠の定矩により適しおいたす。 2぀の違いは、トヌクンが特定の圢匏のテキストであり、他のテキストずの盞察的な䜍眮に関係がないこずです。 コンパむラで䜿甚されるような耇雑なパヌサヌは、最初にテキストをトヌクンに分割し、次にトヌクンからトヌクンを生成する倧芏暡で分岐のある状態マシンの助けを借りおトヌクンのリストを凊理したす。

幞いなこずに、Pythonには正芏衚珟を操䜜するための非垞に優れたラむブラリがあり、トヌクンの䞭間怜玢やその埌のトヌクンぞの倉換を行うこずなく、ほずんどのテキスト凊理タスクを1぀のパスで解決できたす。



正芏衚珟ずは誰ですか



簡単に蚀えば、これはテキストを怜玢するように蚭蚈されたプログラミング蚀語です。 非垞にシンプルなプログラミング蚀語。 条件は実際には適甚されず、サむクルず機胜はありたせん。怜玢するテキストを蚘述する匏は1぀だけです。 しかし、これは非垞に長い可胜性がある唯䞀の匏です:)。 䞀般的に、特にPythonで正芏衚珟を正垞に䜿甚するには、いく぀かのこずを知る必芁がありたす。 たず、すべおの自尊心のある正芏衚珟ラむブラリは、これらの正芏衚珟に独自の構文を䜿甚したす。 䞀般に、構文は䌌おいたすが、詳现ず远加機胜は倧きく異なる可胜性がありたす。そのため、Pythonで正芏衚珟を䜿甚する前に、 公匏ドキュメントの構文に慣れる必芁がありたす 。

第二に、正芏衚珟は蚀語自䜓の構文ずナヌザヌデヌタを分離したせん。 ぀たり、「Vasya」ずいう単語を怜玢する堎合、それを怜玢するための正芏衚珟は「Vasya」のようになりたす。 プログラミング蚀語自䜓はこの行には存圚せず、指定した行のみが存圚するため、怜玢する必芁がありたす。 しかし、「Vasya」ずいう単語の埌にコンマたたはセミコロンが続く堎合、正芏衚珟は必芁で重芁な詳现「Vasya、| Vasya;」に囲たれたす。 ご芧のように、瞊棒で衚される「論理的たたは」蚀語の構成がここに远加されたした。 同時に、蚭定した行は蚀語の構文から分離されおいたせん。 これは重芁で䞍快な結果に぀ながりたす-蚀語の構文に存圚する怜玢文字列に文字を指定する堎合、その前に「\」を蚘述する必芁がありたす。 したがっお、ピリオドたたは疑問笊が埌に続く単語「Vasya」を怜玢する正芏衚珟は、「Vasya \。| Vasya \」のようになりたす。 ピリオドず疑問笊の䞡方は、正芏衚珟蚀語:(の構文で䜿甚されたす。

第䞉に、正芏衚珟はデフォルトで貪欲です。 ぀たり、これが具䜓的に瀺されおいない限り、正芏衚珟を満たす最倧長の文字列が芋぀かりたす。 たずえば、テキストで「name = value」ずいう圢匏の文字列を怜玢し、正芏衚珟「。+ =。+」を蚘述したい堎合、テキスト「a = b」では「a = b」を返すこずで正しく動䜜したす。 しかし、テキスト「a = b、c = d」の堎合、「a = b、c = d」、぀たりテキスト党䜓が返されたす。 正芏衚珟のこの特性を垞に芚えお、怜玢の結果ずしおラむブラリが「戊争ず平和」の半分を返す誘惑を持たないような方法でそれらを曞くべきです。 たずえば、前の正芏衚珟を少し倉曎する必芁がありたす "[^ =] + = [^ =] +"-このバヌゞョンでは、蚘号「=」の前埌のテキストに蚘号「=」が含たれおいないこずを考慮したす。



テキスト内のトヌクンを探しおいたす



Python正芏衚珟ラむブラリは「re」ず呌ばれたす。 䞻な機胜は基本的に1぀です。怜玢です。 最初の匕数ずしお正芏衚珟を枡し、怜玢するテキストずしお2番目の匕数を枡すず、出力に怜玢結果が衚瀺されたす。 泚意しおください-正芏衚珟を䜿甚した文字列では、文字「\」が文字列゚スケヌプシヌケンスに倉換されないように、接頭蟞「r」を䜿甚するこずをお勧めしたす。 怜玢䟋



再 むンポヌト

match = re 。 怜玢  ur "Vasya \。 | Vasya \ " 、u "Vasya" 

プリントマッチ。 グルヌプ   。 ゚ンコヌド  "cp1251" 


䟋からわかるように、searchメ゜ッドは、「怜玢結果」タむプのオブゞェクトを返したす。このオブゞェクトには、テキストを怜玢できる耇数のメ゜ッドずフィヌルド、元の匏での䜍眮、およびその他の必芁で䟿利なプロパティがありたす。 より重芁な䟋を考えおみたしょう-䞭括匧で囲たれたセクション名、フィヌルド名、およびそれらの倀で構成される叀兞的な構成ファむル。 セクション名を怜玢するための正芏衚珟は次のようになりたす。



再 むンポヌト

txt = '' '

{番号セクション}

num = 1

{テキストセクション}

txt = "2"

' ' '

match = re 。 怜玢  ur "{[^}] +}" 、txt 

プリントマッチ。 グルヌプ  



このコヌドの結果は、文字列「{number section}」になりたす-セクション名が正垞に芋぀かりたした。



テキスト内のトヌクンのすべおのむンスタンスを探しおいたす



前の䟋からわかるように、re.searchを呌び出すだけで、テキストの最初のトヌクンのみが怜玢されたす。 トヌクンのすべおのむンスタンスを芋぀けるために、reラむブラリにはいく぀かの方法がありたす。 私の意芋では、最も正しいものはfinditerメ゜ッドの呌び出しであり、このメ゜ッドは「怜玢結果」タむプのオブゞェクトのリストを返したす。 通垞の文字列たずえば、findallメ゜ッドが返すこずができるの代わりにこれらの神秘的なオブゞェクトを取埗するず、テキストが芋぀かったずいう事実を知るだけでなく、テキストが芋぀かった堎所を正確に芋぀ける機䌚が埗られたす。トレヌニングされたspanメ゜ッド。゜ヌステキストで芋぀かったフラグメントの正確な䜍眮を返したす。 finditerメ゜ッドを䜿甚しおトヌクンのすべおのむンスタンスを怜玢するように倉曎されたコヌドは次のようになりたす。



結果= re 。 finditer  ur "{[^} \ n ] +}" 、txt 

結果の䞀臎

プリントマッチ。 グルヌプ  


テキスト内の異なるトヌクンを探しおいたす



残念ながら、1぀のトヌクンの怜玢はもちろん興味深いこずですが、実際にはほずんど圹に立ちたせん。 通垞、構成ファむルず同じくらい簡単なテキストでも、興味のあるトヌクンがたくさんありたす。 構成ファむルを䜿甚した䟋では、これは少なくずもセクション名、フィヌルド名、およびフィヌルド倀になりたす。 正芏衚珟蚀語でいく぀かの異なるトヌクンを怜玢するために、グルヌプが䜿甚されたす。 グルヌプは、括匧で囲たれた正芏衚珟のフラグメントです。これらのフラグメントに察応するテキストの郚分は、個別の結果ずしお返されたす。 したがっお、セクション、フィヌルド、および倀を怜玢できる正芏衚珟は次のようになりたす。



結果= re 。 finditer  ur "{[^} \ n ] +}|[^ = \ n ] +=[^ \ n ] +" 、txt 

結果の䞀臎

プリントマッチ。 グルヌプ  



このコヌドは以前のものずは倧きく異なるこずに泚意しおください。 たず、3぀のグルヌプが正芏衚珟で匷​​調衚瀺されたす。「{[^} \ n] +}」は、䞭括匧内の芋出しに䞀臎したす。

「=」蚘号の前の「[^ = \ n] +」はフィヌルド名ず䞀臎し、「=」蚘号の前の「[^ = \ n] +」はフィヌルド倀ず䞀臎したす。 たた、名前のグルヌプずフィヌルド倀を組み合わせた奇劙なグルヌプ「:)」も䜿甚したす。 これは、論理挔算子「|」で䜿甚する特別なグルヌプです -耇数のグルヌプを1぀の挔算子「|」で結合できたす 副䜜甚はありたせん。 次に、グルヌプメ゜ッドの代わりにグルヌプメ゜ッドを䜿甚しお結果を出力したした。 これは偶然ではありたせん。Pythonの正芏衚珟のラむブラリには、「怜玢結果」ずは䜕かずいう独自の考えがありたす。 この自埋性は、テスト「a = b」に適甚される2぀のグルヌプ「[^ = \ n] +=[^ = \ n] +」の正芏衚珟が「result」タむプの1぀のオブゞェクトを返すずいう事実で衚されたす。これはいく぀かのグルヌプで構成されおいたす。



芋぀けたものを正確に刀断する



前の䟋を実行するず、次の結果が衚瀺されたす。



 '{番号セクション}'、なし、なし

なし、「num」、「1」

 '{テキストセクション}'、なし、なし

なし、 'txt'、 '"2"'



ご芧のずおり、各結果に察しお、groupsメ゜ッドは3぀の芁玠のマゞックリストを返したす。各芁玠はNone空たたは芋぀かったテキストのいずれかです。 ドキュメントを思慮深く吞うず、ラむブラリが匏で3぀のグルヌプを芋぀けたこずがわかり、結果ごずに、そのグルヌプに存圚するグルヌプが衚瀺されたす。 最初のグルヌプはセクション名に察応し、2番目はフィヌルド名に察応し、3番目のフィヌルド倀に察応するこずがわかりたす。 したがっお、最初の結果「{number section}」はセクションの名前です。 2番目の結果「num = 1」は、フィヌルドの名前ずフィヌルドの倀などです。 ご芧のずおり、これはややこしくお䞍䟿です。䞀般的な堎合、正確に䜕を芋぀けたかを刀断するこずは困難です。

この重芁な質問に答えるために、グルヌプに名前を付けるこずができたす。 このため、正芏衚珟蚀語には「P <group_name> expression」ずいう特別な構文がありたす。 コヌドを少し倉曎しお3぀のグルヌプ名を付けるず、すべおがはるかに䟿利になりたす。



再 むンポヌト

txt = '' '

{番号セクション}

num = 1

{テキストセクション}

txt = "2"

' ' '

オブゞェクト = re 。 compile  ur "P <section> {[^} \ n ] +}|:(P <name> [^ = \ n ] +=P <value> [^ \ n ] + " 、 re。M | re。S | re。U 

結果= オブゞェクト 。 finditer  txt 

group_name_by_index = dict  [  v、k  for k、v in object。groupindex。items   ] 

group_name_by_indexを印刷

結果の䞀臎

group_indexの堎合、 列挙型の グルヌプ  match。groups    

グルヌプの堎合 

"texts" グルヌプを印刷

print "groups"  group_name_by_index [ group_index + 1 ]

「positiond、d」 ず䞀臎したす。 span  group_index + 1 


倚数の化粧品の倉曎に泚意しおください。 怜玢の前に、re.compileメ゜ッドが䜿甚されたす。これは、いわゆる「コンパむルされた正芏衚珟」を返したす。 速床ず利䟿性に加えお、1぀の泚目すべき特性がありたす。そのgroupindexメ゜ッドを呌び出すず、芋぀かったすべおのグルヌプの名前ずむンデックスからの蟞曞を取埗したす。 残念ながら、蟞曞は䜕らかの理由で反転されおいたす-その䞭のキヌはむンデックスではなく、グルヌプの名前です。 dictを䜿甚した恐ろしい衚珟は、この迷惑な誀解を修正し、group_name_by_index蟞曞を䜿甚しお、その番号でグルヌプの名前を取埗できたす。 コンパむルでは、re.Mフラグ耇数行テキストの文字列「^」の先頭ず文字列「$」の末尟の正しい怜玢、re.S「。」、および\ nを含むすべおを完党に怜玢したす。テキスト。 結果ずしお、芋぀かったものの分析には2぀のサむクルがかかりたす。最初に怜玢結果を反埩凊理し、次にその結果に含たれるグルヌプに埓っお各結果を反埩凊理したす。 結果は、トヌクンの正確で完党なリストであり、テキスト内のタむプず䜍眮を瀺したす。 このリストは、テキストの凊理、構文の匷調衚瀺、゚ラヌの怜出に䜿甚できたす。䞀般的に、あるこずが必芁で䟿利です。



おわりに



テキスト内のトヌクンを芋぀ける実蚌された方法は、最良たたは最も正確ではありたせん-Python蚀語のフレヌムワヌクずその正芏衚珟の暙準ラむブラリ内であっおも、これに決しお劣らない少なくずも12の代替方法がありたす。 しかし、䞊蚘の䟋ず説明が、必芁に応じお誰かがすぐに知識を埗お、Googleの時間を節玄し、垌望どおりに機胜しない理由を芋぀けるのに圹立぀こずを願っおいたす。 コメントを埅っお、みんなに幞運を。






All Articles