2014-11-21 2 views
1

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

Текст хранится в виде строки с именем температуры и имеет вид:

temp='Somethingorother School District (additional text)|other stuff here' 

настоящее время я использую

match = re.search(r'(.* School District) (\(.*\))\|?',temp) 

который прекрасно работает и соответствует

match.group(1) = Somethingorother School District 
match.group(2) = (additional text) 

Однако , иногда часть «другой материал здесь» также содержит круглые скобки, например:

'Somethingorother School District (additional text)|$59900000 (4.7 mills)' 

так что я получаю

match.group(2) = (additional text)|$59900000 (4.7 mills) 

Я понимаю, что это происходит потому, что оператор * жаден, но (дополнительный текст) часть довольно своеобразная, и я хочу, чтобы захватить все, что в этих скобках. Другими словами, я хочу, чтобы это было жадным в этих круглых скобках, но затем перестаньте смотреть, как только это соответствует а). Есть ли способ сделать это?

+1

Лучший способ заменить '. *' На '[^)] *', который будет соответствовать чему-либо, кроме закрытия ')', и поэтому сделает его прекрасным совпадением, когда вы встретите первый ')' – Tensibai

ответ

2

Использовать negated character class.

>>> match = re.search(r'(.* School District) (\([^()]*\))\|?',temp) 
>>> match.group(1) 
'Somethingorother School District' 
>>> match.group(2) 
'(additional text)' 

[^()]* соответствует любому символу, но не из ( или ) ноль или более раз.

DEMO

+0

Демо [здесь] http://regex101.com/r/pO2sU3/1) (в случае, если это может помочь) – Tensibai

+0

спасибо за демонстрационную ссылку. –

1

Помещенный не жадный на последних скобках.

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