2013-05-29 4 views
0

Я хотел соответствовать содержанию внутри скобок (один с «на контракт», но опустить unwatned элементы, такие как «=» в 3-й линии), как это:Regex в Python для согласования содержимого внутри()

1/100 of a cent ($0.0001) per pound ($6.00 per contract) and 
.001 Index point (10 Cents per contract) and 
$.00025 per pound (=$10 per contract) 

Я использую следующее регулярное выражение:

r'.*?\([^$]*([\$|\d][^)]* per contract)\)' 

Это хорошо работает для любого выражения внутри скобок, которая начинается не с $, но на вторую линию, она опускает 1 от 10 Cents. Не уверен, что здесь происходит.

+0

Каков ваш ожидаемый результат от этого текста? –

+0

Вы печатаете весь матч или группу? – BrenBarn

+0

Я хочу вернуть 'foo per contract', yes –

ответ

1

на вторую линию, она опускает 1 из 10 центам. Не уверен, что здесь происходит.

Что происходит в том, что [^$]* жаден: Это будет счастливо соответствовать цифры, и оставить только одну цифру, чтобы удовлетворить [\$|\d], что следует за ним. (Итак, если вы написали (199 cents, вы получили бы только 9). Закрепите его, написав вместо этого [^$]*?:

r'.*?\([^$]*?([\$|\d][^)]* per contract)\)' 
2

Вы могли бы использовать менее специфичный регулярное выражение

re.findall(r'\(([^)]+) per contract\)', str) 

Это будет соответствовать «$ 6,00» и «10 центов».

+0

Извините, я забыл добавить одну строку, я хочу пропустить такие вещи, как« = »в начале выражения –

+0

@JamesHallen В этом случае вы, вероятно, можете попробовать что-то вроде' \ (([^ =)] [^)] *) ', но я не уверен, что такое« вещи как »=« »означает конкретно –

+0

Проверьте третью строку в моем вопросе, я ее обновил. –

0

Вы можете использовать:

r'(?<=\()[^=][^)]*? per contract(?=\))' 
+0

Извините, пожалуйста, проверьте новое редактирование. –

0

Это будет соответствовать выходу, указанному в комментариях:

re.search('\((([^)]+) per contract)\)', str).group(1) 
Смежные вопросы