re.search()和re.findall()在查找正则表达式模式(Python)方面是否有所不同?

时间:2018-09-03 15:35:56

标签: python regex

我的问题的演示如下:

我的代码:

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提供的有用答案!

2 个答案:

答案 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);
 }
}