正则表达式返回两个特殊字符之间的所有字符

时间:2012-03-27 12:36:38

标签: python regex parsing

我如何使用regx返回两个括号之间的所有字符。 这是一个例子:

foobar['infoNeededHere']ddd
needs to return infoNeededHere

我在大括号之间找到了一个正则表达式,但所有尝试使用方括号的尝试都失败了。这是正则表达式:(?<={)[^}]*(?=}),这是我试图破解它

(?<=[)[^}]*(?=])

最终解决方案:

import re

str = "foobar['InfoNeeded'],"
match = re.match(r"^.*\['(.*)'\].*$",str)
print match.group(1)

3 个答案:

答案 0 :(得分:30)

如果您不熟悉 REG (gular) EX (压力),请在Python Docs了解相关信息。或者,如果您想要更温和的介绍,可以查看HOWTO。它们使用Perl风格的语法。

正则表达式

您需要的表达式为.*?\[(.*)\].*。您想要的群组将是\1 - .*? .匹配除换行符之外的任何字符。 *是元字符,表示重复此次0次或以上?使*非贪婪,即.在匹配'['。}之前将匹配尽可能少的字符。 - \[ \转义特殊元字符,在本例中为[。如果我们不这样做,[会做一些非常奇怪的事情 - (.*) 括号'分组'其中的任何内容,您可以稍后通过其数字ID或名称检索这些组(如果它们被赋予一个)。
- \].* 你现在应该知道这意味着什么。

实施

首先,将re模块 - 它不是内置模块 - 导入到您希望使用表达式的位置。

然后,使用re.search(regex_pattern, string_to_be_tested)搜索要测试的字符串中的模式。这将返回MatchObject,您可以将其存储到临时变量中。然后,您应该调用它的group()方法并将1作为参数传递(以查看我们之前使用括号捕获的“组1”)。我现在应该看起来像:

>>> import re
>>> pat = r'.*?\[(.*)].*'             #See Note at the bottom of the answer
>>> s = "foobar['infoNeededHere']ddd"
>>> match = re.search(pat, s)
>>> match.group(1)
"'infoNeededHere'"

另类

您还可以使用findall()通过将正则表达式修改为(?>=\[).+?(?=\])来查找所有非重叠匹配。
- (?<=\[) (?<=)被称为后备断言,并检查前面实际匹配的表达式。
- .+? +*类似,只是它与一个或更多重复匹配。 ?使其变得非贪婪 - (?=\]) (?=)是一个look-提前断言,并检查跟随匹配的表达式抓住它。
您的代码现在应该如下所示:

>>> import re
>>> pat = r'(?<=\[).+?(?=\])'  #See Note at the bottom of the answer
>>> s = "foobar['infoNeededHere']ddd[andHere] [andOverHereToo[]"
>>> re.findall(pat, s)
["'infoNeededHere'", 'andHere', 'andOverHereToo['] 

注意:始终使用原始Python字符串,方法是在字符串前添加“r”(例如:r'blah blah blah')。

10倍阅读!当没有被接受的时候我写了这个答案,但是当我完成它的时候,有2个矿石出现了,一个被接受了。 :( x

答案 1 :(得分:18)

^.*\['(.*)'\].*$将匹配一行并捕获组中的内容。

您必须使用[

转义]\

rubular.com proof链接中的文档将解释表达式的形成方式。

答案 2 :(得分:8)

如果每行只有一个[.....]个令牌,那么根本不需要使用正则表达式:

In [7]: mystring = "Bacon, [eggs], and spam"

In [8]: mystring[ mystring.find("[")+1 : mystring.find("]") ]
Out[8]: 'eggs'

如果每行有多个,那么你需要修改Jarrod的正则表达式^.*\['(.*)'\].*$以匹配每行多次,并且非贪婪。 (使用.*?量词而不是.*量词。)

In [15]: mystring = "[Bacon], [eggs], and [spam]."

In [16]: re.findall(r"\[(.*?)\]",mystring)
Out[16]: ['Bacon', 'eggs', 'spam']