关于python正则表达式的一些东西

时间:2018-05-22 09:19:17

标签: python

最近,我读过一篇关于数据科学的文章。有一点让我困惑。它是'x.group()'的用法。我仍然无法理解它。我会在图片中显示它下方。
代码是这样的:

import re
negations_dic = {"isn't":"is not", "aren't":"are not", "wasn't":"was not", "weren't":"were not"}
lower_case = "I isn't a sds"
neg_pattern = re.compile(r'\b(' + '|'.join(negations_dic.keys()) + r')\b')
neg_handled = neg_pattern.sub(lambda x: negations_dic[x.group()], lower_case)
print(neg_handled)

这就是图片picture about the question。希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

  1. lambda功能
  2. Lambda函数只是在表达式中定义函数的一种方法。您可以使用以下代码替换您的代码,使用经典函数并且不使用lambda(在代码中没有' x')

    import re
    
    def func(m):
        return negations_dic[m.group()]
    
    negations_dic = {"isn't":"is not", "aren't":"are not", "wasn't":"was not", "weren't":"were not"}
    lower_case = "I isn't a sds"
    neg_pattern = re.compile(r'\b(' + '|'.join(negations_dic.keys()) + r')\b')
    neg_handled = neg_pattern.sub(func, lower_case)
    
    print(neg_handled)
    
    1. sub()方法
    2. 以下是有关sub()方法的Python文档摘录:

        

      sub(repl,string)
        返回通过替换repl替换字符串中最左边的非重叠模式而获得的字符串。 [...]   如果repl是一个函数,则为每个非重叠调用它   发生模式。该函数采用单个匹配对象   参数,并返回替换字符串。

      在您的代码中,参数repl是一个函数:它将正则表达式捕获的每个匹配对象替换为字典negations_dic中的相应值。

      1. match.group()方法
      2. 以下是有关match.group()方法的Python文档摘录:

          

        match.group([group1,...])
          返回匹配的一个或多个子组   如果只有一个参数,则结果为单个字符串[...]
          如果没有参数,group1默认为零(返回整个匹配)   如果groupN参数为零,则相应的返回值是整个匹配的字符串;如果它在包含范围[1..99]中,则它是与相应的带括号的组匹配的字符串。

        这解释了你的结果,即:

        • x.group()相当于x.group(0)
        • x.group(0)返回整场比赛:is'nt
        • x.group(1)返回与第一个带括号的组匹配的字符串:is'nt
        • x.group(2)返回错误,因为没有第二个带括号的组。

        此外,这是一个使用re.search的示例,以便更好地理解group()的工作方式:

        import re
        
        m = re.search(r'((2nd) and (3rd) group)', '2nd and 3rd group')
        
        print(m.group())  # it prints "2nd and 3rd group"
        print(m.group(0)) # it prints "2nd and 3rd group"
        print(m.group(1)) # it prints "2nd and 3rd group"
        print(m.group(2)) # it prints "2nd"
        print(m.group(3)) # it prints "3rd"
        print(m.group(4)) # it returns an error `IndexError: no such group` because there is no 4th group
        
        1. 您应该阅读并了解有关Python中re和lambda函数的更多信息。