我有一个类似于avg(foo)
的字符串,我只想提取foo
。为此,我正在使用
import re
re.sub(")( avg","","avg(foo)")
但这不起作用。我哪里错了?
答案 0 :(得分:2)
首先我关闭你可能想要为你的模式使用r-strings,另外你需要稍微改变你的模式r"avg\((.*)\)"
就足够了。
import re
re.findall(r"avg\((.*)\)", "avg(foo)")
# Will return ['foo']
那么这里发生了什么? 我们使用re.findall来查找与模式匹配的所有匹配项。
模式可以分解为:
avg\(
以avg(
(.*)
任何字符串的子组(可以修改它以匹配更严格的模式)\)
将匹配单个“)”。答案 1 :(得分:0)
我们可以在这里使用re.search
,使用捕获组将函数调用中的文本提取到avg()
:
f_search = re.search(r'\((.*?)\)', 'avg(foo)', re.IGNORECASE)
if f_search:
print f_search.group(1)
答案 2 :(得分:0)
首先,括号表示正则表达式语法中的捕获组,因此如果要匹配文字括号,则需要转义它们。其次,如果你想找到一个特定的字符串,你应该使用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'