Python で正規表現グループの名前を動的に更新する方法はありますか?
たとえば、テキストが次の場合:
person 1: name1
person 2: name2
person 3: name3
...
person N: nameN
何人の人がいるかを事前に知らずに、グループ「person1」、「person2」、「person3」、...、および「personN」にどのように名前を付けますか?
Python で正規表現グループの名前を動的に更新する方法はありますか?
たとえば、テキストが次の場合:
person 1: name1
person 2: name2
person 3: name3
...
person N: nameN
何人の人がいるかを事前に知らずに、グループ「person1」、「person2」、「person3」、...、および「personN」にどのように名前を付けますか?
いいえ、しかし、次のようなことができます:
>>> import re
>>> p = re.compile('(?m)^(.*?)\\s*:\\s*(.*)$')
>>> text = '''person 1: name1
person 2: name2
person 3: name3
...
person N: nameN'''
>>> p.findall(text)
出力:
[('person 1', 'name1'), ('person 2', 'name2'), ('person 3', 'name3'), ('person N', 'nameN')]
簡単な説明:
(?m) # enable multi-line mode
^ # match the start of a new line
(.*?) # un-greedily match zero or more chars and store it in match group 1
\s*:\s* # match a colon possibly surrounded by space chars
(.*) # match the rest of the line and store it in match group 2
$ # match the end of the line
参考文献
名前付きキャプチャ グループと番号付きグループ (\1、\2 など) は動的にすることはできませんが、findall を使用して同じことを実現できます。
文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、見つかった順序で一致が返されます。パターンに 1 つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の一致は、別の一致の先頭に触れない限り、結果に含まれます。
あなたの受け入れられた答えから判断すると、正規表現は必要ありません
p="""
person 1: name1
person 2: name2
person 3: name3
person N: nameN
"""
ARR=[]
for item in p.split("\n"):
if item:
s=item.split(":")
ARR.append(s)
print ARR
出力
$ ./python.py
[['person 1', ' name1'], ['person 2', ' name2'], ['person 3', ' name3'], ['person N', ' nameN']]
Python の正規表現 (正規表現全般に当てはまることは確かです) は、任意の数の一致を許可しません。繰り返し一致全体をキャプチャするか (繰り返しグループをキャプチャ括弧で囲んで)、一連の一致の最後の一致をキャプチャする (キャプチャ グループを繰り返して) ことができます。これは、これらが名前付きまたは番号付きのキャプチャ グループであるかどうかとは関係ありません。
次のように、文字列内のすべての一致を反復処理することにより、プログラムでこれを行う必要があります。
for match in re.findall(pattern, string):
do_something(match)