这个问题在这里已有答案:
我有一个字符串看起来像这个avg(foo)
从哪里我想要只提取foo
。为此,我正在使用
import re
re.sub(")( avg","","avg(foo)")
但这不起作用。我哪里错了?
首先我关闭你可能想要为你的模式使用r字符串,此外你需要改变你的模式有点r"avg\((.*)\)"
应该足够。
import re
re.findall(r"avg\((.*)\)", "avg(foo)")
# Will return ['foo']
那么这里发生了什么? 我们使用re.findall来查找与模式匹配的所有事件。
该模式可以细分为:
avg\(
以avg(
开头的东西(.*)
子组(可以修改它以匹配更严格的模式)\)
将匹配单个“)”。首先,括号表示正则表达式语法中的捕获组,因此如果要匹配文字括号,则需要转义它们。其次,如果你想找到一个特定的字符串,你应该使用re.search
或re.match()
,在这种情况下,因为子字符串没有出现在字符串的前面,你应该使用re.search()
。第三,用于匹配括号内所有内容的正确正则表达式取决于您是否要匹配嵌套的正则表达式。可以使用r"\(([^)(]*)\)
来匹配括号字符以外的所有内容。另一个选择是\((.*)\)
来匹配括号之间的所有内容,但它仍然取决于您的预期格式。
演示:
>>> m = re.search(r"\(([^)(]*)\)","avg(foo)")
>>> m.group(1)
'foo'
>>> m = re.search(r"\((.*)\)","avg(f(o)o)")
>>> m.group(1)
'f(o)o'
>>> m = re.search(r"\(([^)(]*)\)","avg(f(o)o)")
>>> m.group(1)
'o'
我们可以在这里使用re.search
,使用捕获组来提取函数调用avg()
中的文本:
f_search = re.search(r'\((.*?)\)', 'avg(foo)', re.IGNORECASE)
if f_search:
print f_search.group(1)