2016-03-25 2 views
-1

Я провел некоторое исследование, и я изо всех сил пытаюсь понять, как ответить на этот вопрос. У меня есть следующий текст, и я хочу, чтобы извлечь почтовый индекс в поле Служебный адрес:Использование Regex для захвата содержимого после первого появления строки

BUSINESS ADDRESS: 
    STREET 1:  101 AWESOME DRIVE 
    STREET 2:  P O BOX 144 
    CITY:   HOUSTON 
    STATE:   TX 
    ZIP:   77027 
    BUSINESS PHONE: 7138675309 

MAIL ADDRESS: 
    STREET 1:  P O BOX 144 
    CITY:   HOUSTON 
    STATE:   TX 
    ZIP:   77001 

Этот код фиксирует последний экземпляр (77001):

(BUSINESS\s*ADDRESS:)(.*)(ZIP:\s*)(.*) 

Как я могу захватить первый почтовый индекс код (77027)?

Спасибо за помощь noob.

ответ

2

Ну, в вашем примере вам просто нужно добавить знак вопроса и указать, что почтовый состоит только цифры (*.?):

BUSINESS\s*ADDRESS:.*?ZIP:\s*(\d+) 

По умолчанию звездочки и плюс жадные. И не нужно захватить другие, чем почтовый индекс

+0

Благодарим за помощь! Это имеет смысл, но, к сожалению, я не могу заставить код вытащить почтовый индекс. Я извлекаю данные из текстовых файлов. Я просматриваю каждый файл, а затем выполняю следующий код: 'if ($ _ = ~/BUSINESS \ s * ADDRESS:. *? ZIP: \ s * (\ d +) /) {$ Zip = $ 1;}' – TaterTots

+0

@ Инструментарий: у меня его не было в исходном коде. Я просто добавил его к новому коду, и ссылка все еще не тянет. 'if ($ _ = ~/BUSINESS \ s * ADDRESS:. *? ZIP: \ s * (\ d +)/s) {$ Zip = $ 1;}' – TaterTots

+0

Получил это - спасибо! – TaterTots

1

Для тех, кто собирается AWK вещи ...

Существует проверенная версия ниже, при условии, что файл с именем test.txt в текущем каталоге:

awk '{if ($0 ~ /BUSINESS ADDRESS:/) { inzone=1; } if (inzone) {if ($0 ~ /ZIP:/) { print $2; } else if ($0 ~ /MAIL ADDRESS:/) { inzone=0; }}}' test.txt 

Он будет печатать второе поле для всех строк, содержащих ZIP:, но только линии встречаются в блоке между линией, содержащей ДЕЛОВОЙ АДРЕС: а другая строка, содержащая MAIL АДРЕС:

Тест ниже:

awk '{if ($0 ~ /BUSINESS ADDRESS:/) { inzone=1; } if (inzone) {if ($0 ~ /ZIP:/) { print $2; } else if ($0 ~ /MAIL ADDRESS:/) { inzone=0; }}}' test.txt 
77027 
+0

Спасибо! Я никогда не использовал awk. Если я планирую сделать много обработки текста, было бы хорошо для меня узнать больше об этом языке? – TaterTots

+1

AWK был разработан для этого. Существует знаменитый учебник, если вы ищете что-то для начала: http: //www.grymoire.ком/Unix/Awk.html –

1

Оператор матча работает в контексте списка возвращает все значения соответствия, которые были найдены. Таким образом, вы могли бы сделать что-то вроде этого:

my $data = ' 
BUSINESS ADDRESS: 
    STREET 1:  101 AWESOME DRIVE 
    STREET 2:  P O BOX 144 
    CITY:   HOUSTON 
    STATE:   TX 
    ZIP:   77027 
    BUSINESS PHONE: 7138675309 

MAIL ADDRESS: 
    STREET 1:  P O BOX 144 
    CITY:   HOUSTON 
    STATE:   TX 
    ZIP:   77001 
'; 

my @allzips = ($data =~ /ZIP:\s*(\d+)/g); 

foreach my $zip (@allzips) { 
    print "Found ZIP: $zip\n"; 
} 

который печатает:

Found ZIP: 77027 
Found ZIP: 77001 
2

Дано:

my $tgt="BUSINESS ADDRESS: 
    STREET 1:  101 AWESOME DRIVE 
    STREET 2:  P O BOX 144 
    CITY:   HOUSTON 
    STATE:   TX 
    ZIP:   77027 
    BUSINESS PHONE: 7138675309 

MAIL ADDRESS: 
    STREET 1:  P O BOX 144 
    CITY:   HOUSTON 
    STATE:   TX 
    ZIP:   77001"; 

Вы можете сделать:

print "$1: $2\n" while $tgt=~/^(\S[^:]+):[^\R]*\R.*?^\s+ZIP:\s+(\d+)/gms; 

Печать:

BUSINESS ADDRESS: 77027 
MAIL ADDRESS: 77001 

Тот же метод, который вы можете построить хеш, сопоставляя адрес с zip для каждого блока.

Смежные вопросы