1

Python で正規表現グループの名前を動的に更新する方法はありますか?

たとえば、テキストが次の場合:

person 1: name1
person 2: name2
person 3: name3
...
person N: nameN

何人の人がいるかを事前に知らずに、グループ「person1」、「person2」、「person3」、...、および「personN」にどのように名前を付けますか?

4

4 に答える 4

2

いいえ、しかし、次のようなことができます:

>>> 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

参考文献

于 2010-01-07T08:18:36.437 に答える
1

名前付きキャプチャ グループと番号付きグループ (\1、\2 など) は動的にすることはできませんが、findall を使用して同じことを実現できます。

re.findall(パターン、文字列[、フラグ])

文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、見つかった順序で一致が返されます。パターンに 1 つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の一致は、別の一致の先頭に触れない限り、結果に含まれます。

于 2010-01-07T08:19:16.940 に答える
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']]
于 2010-01-07T08:38:21.003 に答える
0

Python の正規表現 (正規表現全般に当てはまることは確かです) は、任意の数の一致を許可しません。繰り返し一致全体をキャプチャするか (繰り返しグループをキャプチャ括弧で囲んで)、一連の一致の最後の一致をキャプチャする (キャプチャ グループを繰り返して) ことができます。これは、これらが名前付きまたは番号付きのキャプチャ グループであるかどうかとは関係ありません。

次のように、文字列内のすべての一致を反復処理することにより、プログラムでこれを行う必要があります。

for match in re.findall(pattern, string):
    do_something(match)
于 2010-01-07T08:20:00.150 に答える