如果您是 REG(gular)EX(pressions) 的新手,您可以通过 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() 将正则表达式修改为(?>=\[).+?(?=\]) 来查找所有不重叠的匹配项。
- (?<=\[): (?<=) 被称为后视断言并检查实际匹配之前的表达式。
- .+?: + 和 * 一样,只是它匹配 一个 或多个重复。 ? 使其不贪婪。
- (?=\]): (?=) 是一个预测 断言并检查表达式跟随匹配而不捕获它。
您的代码现在应该如下所示:
>>> 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[']
注意:始终通过在字符串前添加“r”来使用原始 Python 字符串(例如:r'blah blah blah')。
10 倍的阅读量!我在没有接受的时候写了这个答案,但是当我完成它时,出现了 2 个矿石,一个被接受了。 :( x