Регулярное выражение для возврата текста в скобках

113
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

Все, что мне нужно, это содержимое в скобках.

user469652
источник
Кронштейны? Я не вижу скобок. Вы имели в виду скобки?
kzh 04
4
Почему бы не использовать двойные кавычки? Это сделало бы строку более удобной для чтения, напримерu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh
Этот вопрос заставляет меня нервничать, просто глядя на него. Я получаю скрытое подозрение, что OP действительно хочет иметь эту функциональность astи просто не знает, что она существует.
Кевин,

Ответы:

247

Если ваша проблема действительно настолько проста, вам не нужно регулярное выражение:

s[s.find("(")+1:s.find(")")]
Tkerwin
источник
10
что делать, если нет "(" и ")"? вы получите s [0: -1]. Это означает, что вы получите все, что находится в 's': \. Будет хорошо, если вы сначала убедитесь, что в строке есть скобки.
Омар
5
Что, если у вас будет «(какой-то текст (какой-то текст во внутренних скобках) еще немного текста)»?
Игорь Помаранский
4
Тогда проблема будет не такой простой, как исходная, и потребует другого решения.
tkerwin
1
На вопрос Игоря: если у вас есть такие вложенные скобки, вы используете rfind для второй части операции. См. Мой пост ниже, чтобы узнать больше об этом.
FaustoW
62

Использование re.search(r'\((.*?)\)',s).group(1):

>>> import re
>>> s = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
>>> re.search(r'\((.*?)\)',s).group(1)
u"date='2/xc2/xb2',time='/case/test.png'"
ваан
источник
является ? отметка необходима?
ykpemre
45

Если вы хотите найти все вхождения:

>>> re.findall('\(.*?\)',s)
[u"(date='2/xc2/xb2',time='/case/test.png')", u'(eee)']

>>> re.findall('\((.*?)\)',s)
[u"date='2/xc2/xb2',time='/case/test.png'", u'eee']
TheSoulkiller
источник
может показаться глупым вопросом, но почему знак "?" нужно? Почему "(. *)" Не работает?
CutePoison
3
@CutePoison, потому что .*он жадный (берет самый длинный матч) и .*?не жадный (берет самое короткое совпадение)
dopstar
29

Основываясь на ответе tkerwin, если у вас есть вложенные круглые скобки, как в

st = "sum((a+b)/(c+d))"

его ответ не сработает, если вам нужно взять все, что находится между первой открывающей скобкой и последней закрывающей скобкой, чтобы получить (a+b)/(c+d), потому что поиск ищет слева от строки и остановится на первой закрывающей скобке.

Чтобы исправить это, вам нужно использовать rfindдля второй части операции, чтобы она стала

st[st.find("(")+1:st.rfind(")")]
FaustoW
источник
1
@ALH в этом выражении нет вложенных скобок, поэтому мой ответ подходит для этого.
FaustoW
6
import re

fancy = u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
Анонимный
источник
2
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])
Стивен
источник
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность
ответа