Регулярне вираження для повернення тексту між дужками


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

Все, що мені потрібно, - це вміст всередині дужок.


Дужки? Я не бачу жодних дужок. Ви мали на увазі круглі дужки?
кж

4
Чому б не використовувати подвійні лапки? Це полегшило б читання рядка, тобтоu"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh

Це питання мене нервує, просто дивлячись на це. Мені здається, що підозра підозріло, що ОП дуже хоче функціоналу astі просто не знає, що воно існує.
Кевін

Відповіді:


247

Якщо ваша проблема насправді така проста, вам не потрібен регулярний вираз:

s[s.find("(")+1:s.find(")")]

9
що робити, якщо немає "(" і ")"? ви отримаєте s [0: -1]. Це означає, що ви отримаєте що-небудь в 's': \. Буде добре, якщо ви спочатку перевірте, що рядок має круглі дужки.
Омар

5
Що робити, якщо у вас буде "(якийсь текст (деякий текст у внутрішніх дужках) ще якийсь текст)"?
Ігор Помаранський

4
Тоді проблема не така проста, як початкова проблема, і вимагатиме іншого рішення.
tkerwin

1
На питання Ігоря: якщо ви вклали такі дужки, ви використовуєте rfind для другої частини операції. Дивіться мою публікацію нижче, щоб отримати детальну інформацію про це.
FaustoW

61

Використання 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'"

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']

може бути дурним питанням, але чому "?" потрібні? Чому "(. *)" Не працює?
CutePoison

3
@CutePoison тому .*, що жадібний (візьме найдовший матч) і .*?не жадібний (візьме найкоротший матч)
dopstar

29

Спираючись на відповідь tkerwin, якщо у вас є вкладені дужки, як у

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

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

Щоб виправити це, вам потрібно скористатися rfindдля другої частини операції, щоб це стало

st[st.find("(")+1:st.rfind(")")]

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'])

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращиться довгострокове значення відповіді
sshashank124
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.