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

Posted

技术标签:

【中文标题】正则表达式返回括号之间的文本【英文标题】:Regular expression to return text between parenthesis 【发布时间】:2011-06-21 02:42:40 【问题描述】:
u'abcde(date=\'2/xc2/xb2\',time=\'/case/test.png\')'

我只需要括号内的内容。

【问题讨论】:

括号?我没有看到任何括号。你是说括号吗? 为什么不用双引号?这将使字符串更易于阅读,即u"abcde(date='2/xc2/xb2',time='/case/test.png')" 这个问题看着就紧张。我偷偷怀疑 OP 真的 想要 ast 中的功能,只是不知道它存在。 【参考方案1】:

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

【讨论】:

【参考方案2】:

如果你的问题真的这么简单,你不需要正则表达式:

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

【讨论】:

如果没有'('和')'怎么办?你会得到 s[0:-1]。这意味着您将在 's' :\.如果你先检查字符串是否有括号会很好。 如果您有“(一些文本(内括号中的一些文本)一些更多文本)”怎么办? 那么问题就不像原来的问题那么简单了,需要换个方案。 对于 Igor 的问题:如果您有这样的嵌套括号,则在操作的第二部分使用 rfind。有关详细信息,请参阅下面的我的帖子。【参考方案3】:
import re

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

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

【讨论】:

【参考方案4】:

如果你想找到所有的出现:

>>> 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 因为.* 是贪婪的(将采用最长的匹配)而.*? 不是贪婪的(将采用最短的匹配) 谢谢!可能是整个晚上的最佳答案! 这不起作用....你必须在 r".*((.*?)).*" 之前和之后添加 .*【参考方案5】:

基于 tkerwin 的回答,如果您碰巧有 嵌套括号,如

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

如果您需要在第一个左括号最后右括号 得到(a+b)/(c+d),因为 find 从字符串的左侧开始搜索,并且会在第一个右括号处停止。

要解决这个问题,你需要在操作的第二部分使用rfind,所以它会变成

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

【讨论】:

@ALH 那个表达式没有 nested 括号,这是我的回答的好处。【参考方案6】:
contents_re = re.match(r'[^\(]*\((?P<contents>[^\(]+)\)', data)
if contents_re:
    print(contents_re.groupdict()['contents'])

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值【参考方案7】:

无需使用正则表达式 .... 只需使用列表切片...

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

【讨论】:

这已经在 9 年前发布了。【参考方案8】:

这里有几种方法可以使用匹配的\(([^()]+)\) 正则表达式(参见its online demo)在 Pandas 中提取括号之间的字符串

\( - 一个 ( 字符 ([^()]+) - 然后将除 () 之外的任何一个或多个字符捕获到第 1 组 \) - ) 字符。

提取第一个匹配项使用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(', ') 用于从结果字符串列表中创建一个逗号分隔的字符串。您可以根据自己的情况调整此分隔符。

【讨论】:

【参考方案9】:

TheSoulkiller 的回答很棒。就我而言,我需要处理额外的括号,并且只提取括号内的单词。一个很小的改变就可以解决问题

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

【讨论】:

以上是关于正则表达式返回括号之间的文本的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式获取方括号之间的文本,包括差异?

正则表达式提取方括号之间的文本[重复]

用于在最后一个括号 () 之间获取文本的正则表达式

notepad++正则表达式删除大括号之间的所有文本

用于捕获嵌套括号中的值的正则表达式

正则表达式提取大括号之间的数据并加载到 AMQ