1

私は正規表現に不慣れで、電話番号を識別して抽出できるようにするために、電話番号のパターンを書き込もうとしています。私の疑問は、次の簡単な例に要約できます。

最初に、文字列内にオプションである必要がある(+34)のようなものがあるかどうかを識別しようとします。

prefixsrch = re.compile(r'(\(?\+34\)?)?')

次の文字列で次の方法でテストします。

line0 = "(+34)"
print prefixsrch.findall(line0)

結果は次のようになります。

['(+34)'、'']私の最初の質問は、なぜパターンが2回出現するのかということです。これは接頭辞がオプションであるという事実に関連していると思いますが、私はそれを完全には理解していません。とにかく、今私の大きな疑問のために

9桁のパターンを検索して同様のことを行うと、同じ結果が得られます。

numsrch = re.compile(r'\d{9}')
line1 = "971756754"
print numsrch.findall(line1)

次のようなものが得られます:

['971756754']

大丈夫です。ここで、私がやりたいのは、前にあるかどうかに関係なく、9桁の数字を(+34)で識別することです。したがって、私の理解では、次のようなことを行う必要があります。

phonesrch = re.compile(r'(\(?\+34\)?)?\d{9}')

次の文字列でテストすると...

line0 = "(+34)971756754"
line1 = "971756754"

print phonesrch.findall(line0)
print phonesrch.findall(line1)

これは、驚いたことに、私が得たものです。

['(+34)'] ['']

私が期待していたのは['(+34)971756754']と['971756754']です。誰かがこれについての洞察を持っていますか?事前にどうもありがとうございました。

4

1 に答える 1

2

キャプチャグループが間違っています。非キャプチャグループ内で国コードを作成し、キャプチャグループ内で式全体を作成します

>>> line0 = "(+34)971756754"
>>> line1 = "971756754"
>>> re.findall(r'((?:\(?\+34\)?)?\d{9})',line0)
['(+34)971756754']
>>> re.findall(r'((?:\(?\+34\)?)?\d{9})',line1)
['971756754']


 My first question is: why does it find two occurrences of the pattern?

これは、?0回または1回の繰り返しに一致することを意味するため、空の文字列も有効な一致であるためです。

于 2012-12-17T10:37:36.300 に答える