最近,我读过一篇关于数据科学的文章。有一点让我困惑。它是'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。希望有人可以帮助我。
答案 0 :(得分:1)
lambda
功能 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)
sub()
方法 以下是有关sub()
方法的Python文档摘录:
sub(repl,string)
返回通过替换repl替换字符串中最左边的非重叠模式而获得的字符串。 [...] 如果repl是一个函数,则为每个非重叠调用它 发生模式。该函数采用单个匹配对象 参数,并返回替换字符串。
在您的代码中,参数repl
是一个函数:它将正则表达式捕获的每个匹配对象替换为字典negations_dic
中的相应值。
match.group()
方法 以下是有关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
re
和lambda函数的更多信息。