2016-08-17 2 views
0

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

1 Cliff Street ; Fremantle, Western Australia ; AUSTRALIA 
10 Montpelier Square, London SW7 1JU ;,; UNITED KINGDOM 
125 Hay Street ; East Perth, Western Australia ; AUSTRALIA 
1395 Brickell Ave 3404, Miami, FL 33131 ;,; USA 
14 Save Ljuboje ; Banja Luka,; BOSNIA AND HERZEGOVINA 
15 Grosvenor Street ; Beaconsfield, Western Australia ; AUSTRALIA 
151 Royal Street, 2nd Floor ; East Perth, Western Australia ; AUSTRALIA 
168-170 St Georges Terrace ; Perth, Western Australia ; AUSTRALIA 
184 Bennet Street ; East Perth, Western Australia ; AUSTRALIA 
189 Royal Street ; East Perth, Western Australia ; AUSTRALIA 
197 St Georges Terrace ; Perth, Western Australia ; AUSTRALIA 

Пример: 1 Cliff Street ; Fremantle, Western Australia ; AUSTRALIA Я хотел бы только Fremantle, Western Australia ; AUSTRALIA и не адрес метки вдоль. Это всего лишь образец моего набора данных, и я хотел бы получить только последние 3 строки в каждой строке. Было бы здорово, если бы кто-нибудь может помочь мне

+3

Split на ',' если поля являются фиксированными. В противном случае вам нужно будет использовать некоторое программное обеспечение для анализа почтовых адресов. – sln

+0

Какое программирование вы используете внизу? – Jan

+0

Записи типа '10 Площадь Монтпилиера, Лондон SW7 1JU ;,; СОЕДИНЕННОЕ КОРОЛЕВСТВО' заставляет меня думать, что простое регулярное выражение SO может быть не лучшим решением, если вы говорите о разборе большого количества записей ... – 1252748

ответ

0

Вы могли бы использовать, захватив группы для этого ...

(.*);(.*);(.*)

Это регулярное выражение разбивает строку на 3 группы. Как вы получаете доступ к группам из объекта соответствия, зависит от библиотеки регулярных выражений вашего языка.


Как предложил @sin, лучший подход, вероятно, будет просто разделив строку на ; характер. Просто зайдите в Google для «String Splitting», чтобы узнать, как это делается на вашем языке. Использование регулярных выражений слишком усложняет эту проблему.

+0

Это ** очень ** неэффективно. Представьте себе, как работает механизм регулярных выражений: он встречает шаблон '. *', Который * выводит вас вниз по линии, а затем возвращается назад *. Это делается три раза в строке в вашем примере. ** Пожалуйста, будьте более конкретными ** и попробуйте сказать, чего вы на самом деле хотите: не '' '- тогда скажите это: ['^([^;] *); ([^;] *); ([^; ] *) $ '] (https://regex101.com/r/nG5dZ0/2). Ваш: ** 1512 ** шагов, мой ** 666 **, сокращение более чем на половину. – Jan

0

Если вы хотите, чтобы соответствовать им использовать это регулярное выражение:

[1-9a-zA-Z\s,]+;[1-9a-zA-Z\s]+$ 

Демо: https://regex101.com/r/cF1gW4/1

EDIT

Если вы хотите, чтобы оставить их и удалить первую часть адреса, используя SublimeText заменить это:

^[1-9a-zA-Z\s,]+;\s? 

ничем

Демо: https://regex101.com/r/cF1gW4/3

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