文字列を分割して辞書のキーを生成していますが、括弧に問題があります。
文字列の現代的な建物(2000 ceから現在まで)を取得して、、、、およびの3つcontemporary
のキーに分割したいと思います。building(s)
(2000 c.e. to present)
今まで使ってきましたre.findall('\w+', key)
どんな助けでも大歓迎です。
re.findall('[(][^)]*[)]|\S+', key)
括弧内に括弧がない場合は、を使用することもできます。
おそらく正規表現でこれを行うことができます。あなたは間違いなくパーサーでそれを行うことができます。ただし、どちらもかなり複雑なので、より強力で一般性が必要な場合を除いて、元の部分をマージしてみませんre.findall('\w+', key)
か?
parts = re.findall('[\w)(\.]+', key)
[parts[0], parts[1], parts[2] + " " + parts[3] + " " + parts[4] + " " + parts[5]]
より一般的には、開き括弧と閉じ括弧の数を数えてパーツをループすることができます。開いているパレンごとに増加し、閉じているパレンごとに減少するカウンターを保持します。カウンターが0から1になるたびに、パーツの連結を開始し、再び0に達したときに停止します。
これらの単純な解決策は、文字列がかなり単純で適切に動作するかどうかに依存しますが、すべての解決策はある程度なります。
次の正規表現は、次を使用してトリックを実行する必要がありますre.findall
。
(?:\w+(?:\(\w+\))?)|(?:\([\w\ \.]+\)))
最初のグループ(?:\w+(?:\(\w+\))?)
は一連の単語文字と一致し、その後に括弧内のオプションの一連の単語文字が続きます。
\w+ - word character one or more times
\(\w+\)? - (optional) opening parenthesis, word character one or more times,
closing parenthesis
2番目のグループ(?:\([\w\ \.]+\)))
は、括弧で囲まれた任意の単語文字、スペース、またはピリオドと一致します。
\([\w\ \.]+\) - opening partnthesis, (either a word character,
space or period one or more times), closing parenthesis
各?:
グループの先頭にあるのは、キャプチャしないことを意味するため、.findall
必要な一致のみを返します。
これは、提供した例または非常に類似したもので機能することが実際に保証されているだけであり、入力にさらに多くの変動がある場合は、追加の考慮事項を考慮して行うことができますが、これは始まりです。