Regular expression to return text between parenthesis

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

All I need is the contents inside the parenthesis.

276164 次浏览

使用 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'"

如果您的问题真的就是这么简单,那么就不需要 regex:

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


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


print re.compile( "\((.*)\)" ).search( fancy ).group( 1 )

如果你想找到所有的事件:

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

基于 tkerwin 的答案,如果你碰巧有 嵌套括号喜欢

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

如果你需要取 < em > 第一个 开括号最后一个括号之间的所有内容才能得到 (a+b)/(c+d),那么他的答案就不起作用了,因为从字符串的左边查找搜索,并且会在第一个括号处停止。

为了解决这个问题,需要在操作的第二部分使用 rfind,这样它就会变成

st[st.find("(")+1:st.rfind(")")]
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
print(contents_re.groupdict()['contents'])

不需要使用 regex... 。 只要使用列表切片..。

string="(tidtkdgkxkxlgxlhxl) ¥£%#_¥#_¥#_¥#"
print(string[string.find("(")+1:string.find(")")])

以下是使用匹配的 \(([^()]+)\)正则表达式(参见 它的在线演示)提取熊猫中括号之间的字符串的几种方法

  • \(-a (字符
  • 然后将除 ()以外的任何一个或多个字符捕获到第1组
  • \)-a )字符。

使用 Series.str.extract提取第一个匹配项 :

import pandas as pd
df = pd.DataFrame({'Description':['some text (value 1) and (value 2)']})
df['Values'] = df['Description'].str.extract(r'\(([^()]+)\)')
# => df['Values']
#    0    value 1
#    Name: Values, dtype: object

使用 Series.str.findall提取(发现)所有 的事件:

import pandas as pd
df = pd.DataFrame({'Description':['some text (value 1) and (value 2)']})
df['Values'] = df['Description'].str.findall(r'\(([^()]+)\)')
# => df['Values']
#    0    [value 1, value 2]
#    Name: Values, dtype: object


df['Values'] = df['Description'].str.findall(r'\(([^()]+)\)').str.join(', ')
# => df['Values']
#    0    value 1, value 2
#    Name: Values, dtype: object

注意,.str.join(', ')用于从结果字符串列表中创建逗号分隔的字符串。您可以根据您的场景调整这个分隔符。

灵魂杀手的回答很棒。就我的情况而言,我需要处理额外的括号,只提取括号内的单词。一个很小的改变就能解决问题

>>> s=u'abcde((((a+b))))-((a*b))'
>>> re.findall('\((.*?)\)',s)
['(((a+b', '(a*b']
>>> re.findall('\(+(.*?)\)',s)
['a+b', 'a*b']

Testcase

s = "(rein<unint>(pBuf) +fsizeof(LOG_RECH))"

结果

['pBuf', 'LOG_RECH', 'rein<unint>(pBuf) +fsizeof(LOG_RECH)']

执行

def getParenthesesList(s):
res = list()
left = list()
for i in range(len(s)):
if s[i] == '(':
left.append(i)
if s[i] == ')':
le = left.pop()
res.append(s[le + 1:i])
print(res)
return res

如果我没有错过什么,那么给@tkerwin 一个小小的修正: S [ s.find (“(”) + 1: s.rfind (“)”)]

第二个查找应该是 rfind,这样就可以从字符串的末尾开始搜索