2015-05-19 3 views
1

У меня есть регулярное выражение, которое захватывает пригороды из строки, которая обычно содержит пригород и промышленность в формате:захватить все после того, как характер, если его настоящее

INDUSTRY - SUBURB 

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

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

следующее регулярное выражение не работает: (- |^)(.*)(,|$)

Результат: dvertising - Roseville Chase

+0

Почему бы вам просто не разбить строку на «-»? (пробел пространства) –

+0

@RobertHarvey моя программа использует Regex для обработки строк. Использование других методов возможно, но я хочу поддерживать согласованность. –

+4

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

ответ

2

Вместо использования (.*) используйте ([^-]*):

(- |^)([^-]*)(,|$) 

В действии:

import re 

re.search(r"(- |^)([^-]*)(,|$)", "Advertising - Roseville Chase").group(2) 
Out[97]: 'Roseville Chase' 

re.search(r"(- |^)([^-]*)(,|$)", "Roseville Chase").group(2) 
Out[98]: 'Roseville Chase' 

* Требуется дополнительное разъяснение:

[^ -] означает «любой символ кроме -». Используя [^ -], вы не позволяете регулярному выражению соответствовать всей строке, если присутствует дефис. Он должен будет соответствовать всему после дефиса.

+0

немного больше объяснение будет хорошо. –

3

Есть две группы: одна для отрасли плюс дефис и одна для пригорода. Сделайте группу промышленности необязательной с вопросительным знаком.

pattern = re.compile(r"([^-]*-)?(.*)") 
pattern.match("Advertising - Roseville Chase").group(2) 
pattern.match("Amityville").group(2) 
-1

Вы можете сделать это: (?<=-\s)(.*) который будет возвращать все после -. Вы можете опробовать его here. example

1

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

Я бы просто пойти:

def suburb_or_all(text): 
    industry, hyphen_present, suburb = text.partition(' - ') 
    return suburb if hypen_present else text 

полностью читаемым, самодокументирован и весьма эффективно.

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