2011-01-10 1 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().

В-третьих, это регулярное выражение может быть написано как r"\d{5}(?:[ -]?\d{4})".

В-четвертых, всегда используйте необработанные строки с регулярными выражениями.

0

Попробуйте это:

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" 

Это возвращает «12345» на любом из

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 

Я его соответствие только в конце строки, так как в противном случае она была также соответствие «23901» (с адреса улицы) в вашем примере.