2016-08-30 2 views
0

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

Пример сырого корма:

LEO'SFINEFOOD&WINEHARTWELLJune350.0735.00ICGROUP,INC.MELBOURNEJune5UNITEDSTATESDOLLARAUD50.07includesconversioncommissionofAUD1.469.96WOOLWORTHS3335CHADSTOCHADSTONE 

Ищу, чтобы извлечь это из вышеизложенного:

(ICGROUP,INC.MELBOURNE)June5UNITEDSTATESDOLLARAUD(50.07)includesconversioncommissionof 

со скобками, представляющими две группы я после. Последовательные части во всех случаях того, что я пытаюсь извлечь это:

DIGITS (TEXT) DATE TEXT AMOUNT includesconversioncommissionof 

Я был в состоянии использовать регулярное выражение:

([A-Z][a-z]\d)[A-Z]AUD(\d\,?\d+?.\d*)includesconversioncommissionofAUD 

, чтобы мне дату и сумму. Я пытаюсь найти способ получить в соответствии с примером выше слов ICGROUP,INC.MELBOURNE Я попытался поставить \d\d(.*) перед вышеназванным регулярным выражением, но это почему-то не работает.

Буду признателен, если кто-нибудь сможет помочь с тем, что мне нужно!

+1

Что это за ужасный формат? В части 'WELLJune350.07', как вы можете узнать, где заканчивается дата и где начинается сумма?Ладно, нет 35-го июня, но что, если это было «Июнь 250.07»? Это 50 долларов на 2 июня, или 0,07 доллара за 25 июня? –

+0

Это довольно жестко и определенно растягивает границы того, что можно сделать здоровым. Вы уверены, что они не могут отправить вам данные с некоторыми разделителями? Является ли значение в позиции после 'ICGROUP, INC.MELBOURNE' всегда полного имени месяца, за которым следует числовой день? – mwp

+0

Эй! Я на самом деле был «LEO'SFINEFOOD & WINEHARTWELL» много раз :) – Bohemian

ответ

1

Ближайший я думаю, что мы можем получить (PCRE) что-то вроде:

/ 
    [\d,.]+      # a currency value to bookend 
    (.+?)       # capture everything in-between 
    [A-Z][a-z]+\d+     # a month followed by a day, e.g. "June5" 
    .+?       # everything in-between 
    ([\d,.]+)      # capture a currency value 
    includesconversioncommissionof # our magic token to bookend 
/x 

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

Я использую шаблон [\d,.] для валюты, но вы можете заменить его чем-то более сложным, особенно если вы ожидаете странных форматов и символов валюты. Самая большая потенциальная ошибка здесь, если токен ICGROUP,INC.MELBOURNE может начинаться с числа. Тогда вам определенно понадобится более сложная модель валюты!

0

Вот что у меня есть (в php).

$string = "LEO'SFINEFOOD&WINEHARTWELLJune350.0735.00ICGROUP,INC.MELBOURNEJune5UNITEDSTATESDOLLARAUD50.07includesconversioncommissionofAUD1.469.96WOOLWORTHS3335CHADSTOCHADSTONE"; 

$cleaned = preg_replace("/^(LEO'SFINEFOOD&WINEHARTWELL)([A-Za-z]{3,9})(\.|\d)*/", "", $string); 
echo $cleaned; 

, что она возвращает это: ICGROUP, INC.MELBOURNEJune5UNITEDSTATESDOLLARAUD50.07includesconversioncommissionofAUD1.469.96WOOLWORTHS3335CHADSTOCHADSTONE

Что вы можете использовать и запустить свой собственный маленький регулярное выражение на.

Объяснения:

\w{3,9} используется для удаления месяца, который может быть длиной 3-9 символов. Затем (\.|\d)* должен удалить цифры и точки. Я думаю, что мы могли бы лучше проанализировать месяц/дату, используя ваше регулярное выражение, чтобы извлечь эту часть 5 июня, но из приведенного вами примера это не обязательно.

Однако было бы гораздо полезнее, если бы вы могли предоставить по крайней мере 3 примера, оптимально 5, чтобы мы могли получить хорошее представление о шаблоне. В противном случае это лучшее, что я могу сделать с тем, что вы дали.

+1

@ a-lau Когда вы определяете класс символов в регулярном выражении с помощью '[]', он по определению соответствует любому символу в этом классе. Поэтому оператор трубы в вашем классе символов не нужен; на самом деле, это неправильно, потому что он будет соответствовать символу трубы в строке ввода! Вам также не нужно избегать символа периода в классе символов; PCRE понимает из контекста, что вы имеете в виду буквальный период. – mwp

+0

@mwp моя ошибка, должна была быть круглой скобкой. Изменится. –

+0

Спасибо за это. Благодаря тому, что он работает, благодаря всем ответам! –

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