正则表达式返回括号之间的文本
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']
【讨论】:
以上是关于正则表达式返回括号之间的文本的主要内容,如果未能解决你的问题,请参考以下文章