2011-01-10 8 views
1

私は正規表現を使用して、スクリプトからページからいくつかの値を収集しています。私はre.matchを条件に使用していますが、falseを返しますが、finditerを使用するとtrueを返し、条件の本体が実行されます。私は自分自身のビルドテスターでその正規表現をテストし、スクリプトではなく、そこに働いている。 ここはサンプルスクリプトです。re.finditerとre.matchを使用したときの動作が異なります

result = [] 
RE_Add0 = re.compile("\d{5}(?:(?:-| |)\d{4})?", re.IGNORECASE) 
each = ''Expiration Date:\n05/31/1996\nBusiness Address: 23901 CALABASAS ROAD #2000 CALABASAS, CA 91302\n' 
if RE_Add0.match(each): 
    result0 = RE_Add0.match(each).group(0) 
    print result0 
    if len(result0) < 100: 
     result.append(result0) 
    else: 
     print 'Address ignore' 
else: 
    None 

答えて

1

re.matchは、文字列の先頭に一度だけ一致します。 re.finditerは、これに関してはre.searchに類似しており、すなわち反復的に一致する。比較:

>>> re.match('a', 'abc') 
<_sre.SRE_Match object at 0x01057AA0> 
>>> re.match('b', 'abc') 
>>> re.finditer('a', 'abc') 
<callable_iterator object at 0x0106AD30> 
>>> re.finditer('b', 'abc') 
<callable_iterator object at 0x0106EA10> 

ETAを:あなたはページに言及しているので、私はあなたがHTMLの構文解析の話をしていると推測することができ、その場合は、BeautifulSoupまたは類似のHTMLパーサを使用しています。正規表現は使用しないでください。

+0

このスクリプトを実行する方法を教えてください。私は最後の6時間立ち往生しています。解決策が見つかりませんでした:-(残念ながら私は良いプログラマーではありません:-( – Shahzad

3

re.finditer()は、一致するものがなくても反復子オブジェクトを返します(if RE_Add0.finditer(each)は常にTrueを返します)。実際に一致があるかどうかを調べるには、オブジェクトを実際に反復処理する必要があります。

次に、re.match()は、文字列の最初の部分にのみ一致し、re.search()またはre.finditer()と一致します。

第3に、その正規表現はr"\d{5}(?:[ -]?\d{4})"と書くことができます。

第4に、正規表現で生の文字列を使用します。

0

この試してみてください。これがそうでなければ、それはまた、「23901」を、一致したため、私は、それが行の末尾にのみ一致してい

12345\n 
12345 \n 
12345 6789\n 
12345 6789 \n 
12345 \n 
12345  \n 
12345-6789\n 
12345-6789 \n 
12345-\n 
12345- \n 
123456789\n 
123456789 \n 
12345\n 
12345 \n 

のいずれかに「12345」を返す

import re 

postalCode = re.compile(r'((\d{5})([ -])?(\d{4})?(\s*))$') 
primaryGroup = lambda x: x[1] 

sampleStr = """ 
    Expiration Date: 
    05/31/1996 
    Business Address: 23901 CALABASAS ROAD #2000 CALABASAS, CA 91302 
""" 
result = [] 

matches = list(re.findall(postalCode, sampleStr)) 
if matches: 
    for n,match in enumerate(matches): 
     pc = primaryGroup(match) 
     print pc 
     result.append(pc) 
else: 
    print "No postal code found in this string" 

をあなたの例では(通りの住所から)。

関連する問題