在括号之间返回文本的正则表达式


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

我需要的只是括号内的内容。


括号?我没有看到方括号。你是说括号吗?
kzh11 '02

4
为什么不使用双引号?这将使字符串更易于阅读,即u"abcde(date='2/xc2/xb2',time='/case/test.png')"
kzh11 '02

这个问题让我很紧张。我有点潜意识,OP 确实想要其中的功能ast,只是不知道它的存在。
凯文(Kevin)

Answers:


247

如果您的问题确实如此简单,则不需要正则表达式:

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

9
如果没有'('和')'怎么办?您将得到s [0:-1]。这意味着您将在's':\中得到任何信息。如果您首先检查字符串中是否带有括号,那就太好了。
奥马尔(Omar)

5
如果您将拥有“(某些文本(内括号中的文本)其他文本)”怎么办?
伊戈尔·波马兰斯基

4
这样,问题就不会像原始问题那么简单,因此将需要不同的解决方案。
tkerwin '16

1
对于伊戈尔(Igor)的问题:如果您有这样的嵌套括号,请在操作的第二部分中使用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))"

如果您需要将第一个开括号最后一个闭括号之间的所有内容都取成get (a+b)/(c+d),他的答案将不起作用,因为find从字符串的左侧开始搜索,并且会在第一个闭括号处停止。

要解决此问题,您需要使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.