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

use*_*652 87 python regex python-3.x

u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'
Run Code Online (Sandbox Code Playgroud)

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

tke*_*win 211

如果您的问题真的很简单,那么您不需要正则表达式:

s[s.find("(")+1:s.find(")")]
Run Code Online (Sandbox Code Playgroud)

  • 如果没有'('和')'怎么办?你会得到s [0:-1].这意味着你将得到's'中的任何东西:\.如果你先检查字符串是否有括号,那将会很好. (5认同)
  • 如果你有"(一些文字(内括号中的一些文字)更多的文字)",该怎么办? (3认同)
  • 这样,问题就不会像原始问题那么简单,因此将需要不同的解决方案。 (3认同)
  • 对于 Igor 的问题:如果您有这样的嵌套括号,则在操作的第二部分使用 rfind。有关这方面的更多详细信息,请参阅我下面的帖子。 (2认同)

waa*_*aan 49

用途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'"
Run Code Online (Sandbox Code Playgroud)


小智 32

如果要查找所有出现的事件:

>>> 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']
Run Code Online (Sandbox Code Playgroud)

  • @CutePoison 因为 `.*` 是贪婪的(将采用最长的匹配)而 `.*?` 不贪婪(将采用最短的匹配) (9认同)
  • 可能是一个愚蠢的问题,但为什么是“?” 需要吗?为什么“\(.*\)”不起作用? (2认同)

Fau*_*toW 20

在tkerwin的答案的基础上,如果碰巧有嵌套的括号,如

st = "sum((a+b)/(c+d))"
Run Code Online (Sandbox Code Playgroud)

如果你需要采取之间的一切他的回答是行不通的第一左括号最后一个右括号得到(a+b)/(c+d),因为从字符串的左边找到搜索,并会在第一右括号停止.

要解决这个问题,你需要使用rfind操作的第二部分,这样就可以了

st[st.find("(")+1:st.rfind(")")]
Run Code Online (Sandbox Code Playgroud)

  • @ALH 该表达式没有 **嵌套** 括号,这就是我的答案的好处。 (2认同)

sur*_*190 7

contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可以回答问题,但提供有关如何和/或为何解决问题的附加上下文将提高​​答案的长期价值 (2认同)

小智 6

import re

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

print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )
Run Code Online (Sandbox Code Playgroud)