正規表現エンジンは、一致が見つかるとすぐに積極的な検索を停止することに注意してください。次に、代替の残りのオプションのチェックを続行しないため、特定の状況では順序が重要になります。
この正規表現の目的は、次の 2 つのセクションを組み合わせたものです。
- これらの数字がKINDER、SECONDARY、ELEMENTARY の直前でない限り、文字列の先頭にある数字を削除します。これは簡単です。次の方法でこれを実現できます。
(^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER))
- 序数を構成する数字と文字を組み合わせます (ここで説明します)。例として、
10 st
becomeなどの10st
文字列はabcdefg238947 th
変化しません。対応する正規表現は次のとおりです。
問題は、これら 2 つを合計するときに発生します。最初に 2 番目のルールを設定すると、エンジンは成功して解析を続行することを理解しています。(?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))
text= re.sub(r'(?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))|(^\d*\b )(?!(ELEMENTARY|SECONDARY|KINDER))',
'',
'1 ST KINDER',
0,
re.IGNORECASE)
次の文字列があれば、エンジンは と を一緒1
に設定する必要がありST
ます。次に、1ST
KINDER の前にあると、2 番目のルールに一致しないはずですが、これは当てはまりません。
1 ST KINDER --> ST KINDER
その他の例:
10306 KINDER (OK)
12345 ABC (OK)
1 ST KINDER (SHOULD BE 1ST KINDER)
1 AB KINDER (OK)
SAME regex ステートメントで交互に両方のルールを組み合わせて、序数の場合は数字と文字を組み合わせることを優先し、最初に数字をチェックするにはどうすればよいですか?
次と同じ動作が必要です。
text= re.sub(r'^\d+\b(?!\s+(?:ELEMENTARY|SECONDARY|KINDER))',
'',
re.sub(r'(?<=[0-9])\s+(?=(?:ST|[RN]D|TH)(?: +[^\W\d_]|$))',
'',
'1 ST KINDER',
0,
re.IGNORECASE),
0,
re.IGNORECASE)