我的问题的演示如下:
我的代码:
p = "goalgoalgoalgoalllllgoaloaloal'
print(re.search('g(oal){3}',p).group())
re.findall('g(oal){3}',p)
输出:
goaloaloal
['oal']
使用相同的正则表达式模式,re.search()发现匹配项与我预期的一样是“目标异常”。但是,re.findall()
发现匹配为'oal',这确实让我感到惊讶。有人可以帮忙解释造成这种差异的原因吗?预先谢谢您:-)
说明:很抱歉您看似重复。这个问题的最初目的是在处理正则表达式模式中的括号时找到re.research()和re.findall()方法之间的确切差异。我什至以前都不知道“捕获”一词。更具体地说,我想知道如何使用re.findall()方法精确地提取“ goaloaloal”模式。感谢@blhsing提供的有用答案!
答案 0 :(得分:1)
这是因为re.findall()
仅在捕获组中返回一个子字符串,而re.search()
返回一个Match
对象,并且在您调用group()
方法时Match
对象的值,它将返回与整个正则表达式匹配的子字符串,而不管捕获组如何。
如果您希望re.findall()
返回整个匹配的子字符串,则应改用非捕获组:
re.findall('g(?:oal){3}', p) # returns ['goaloaloal']
答案 1 :(得分:0)
它是由于分组而发生的。 re.findall返回除零组以外的所有匹配组的列表。组用圆括号表示,因此在您的代码中,您有一组import re
p = 'goalgoalgoalgoalllllgoaloaloal'
m = re.search('(g(oal){3})', p)
print(m.group()) # goaloaloal
m = re.findall('(g(oal){3})', p)
print(m) # [('goaloaloal', 'oal')]
。如果您表示包含所有表达式的组,则会得到结果:
public class HelloWorld {
public static void main(String[] args) {
System.out.println(changePi("xpix"));
System.out.println(changePi("pipi"));
System.out.println(changePi("pip"));
}
public static String changePi(String str) {
int len = str.length();
if (len < 2)
return str;
if (str.endsWith("pi"))
return changePi(str.substring(0, len - 2)) + "3.14";
else
return changePi(str.substring(0, len - 1)) + str.substring(len - 1, len);
}
}