11

私はちょうど正規表現を学んでいて、ここで少し混乱しています。4 桁以上 7 桁以下の int を抽出したい文字列があります。私は次のようにそれを試しました:

>>> import re
>>> teststring = 'abcd123efg123456'
>>> re.match(r"[0-9]{4,7}$", teststring)

私は 123456 を期待していましたが、残念ながら、これはまったく結果になりません。ここで誰か助けてくれませんか?

4

3 に答える 3

20

@ExplosionPills は正しいですが、正規表現にはまだ 2 つの問題があります。

まず、文字列の末尾$に一致します。たとえば、文字列の途中で int を抽出できるようにしたいと思います。それを修正するには、これが必要です: abcd123456efg789123456

r"[0-9]{4,7}(?![0-9])"
            ^^^^^^^^^

追加された部分は否定的な先読みアサーションであり、「...これ以上数字が続かない」ことを意味します。\dただし、次を使用して簡単に説明します。

r"\d{4,7}(?!\d)"

その方がいいです。さて、第二の問題。正規表現の左側に制約がないため、 のような文字列が与えられたabcd123efg123456789場合、実際には と一致し3456789ます。したがって、否定の後読みアサーションも必要です。

r"(?<!\d)\d{4,7}(?!\d)"
于 2013-05-02T22:21:18.760 に答える
9

.match文字列がパターンで始まる場合にのみ一致します。を使用し.searchます。

于 2013-05-02T22:12:38.777 に答える
3

以下も使用できます。

re.findall(r"[0-9]{4,7}", teststring)

あなたの場合、正規表現に一致するすべての部分文字列のリストを返します['123456']

最初に一致した部分文字列だけに関心がある場合は、次のように記述できます。

next(iter(re.findall(r"[0-9]{4,7}", teststring)), None)
于 2013-05-02T22:27:07.710 に答える