1

这是 Python 数据科学手册中关于字符串操作方法的 2 个示例,我无法理解。

  1. str.extract()
monte = pd.Series(['Graham Chapman', 'John Cleese', 'Terry Gilliam',
                              'Eric Idle', 'Terry Jones', 'Michael Palin'])
monte.str.extract('([A-Za-z]+)')

此操作返回系列中每个元素的名字。我没有在提取函数中得到表达式输入。

  1. str.findall()
monte.str.findall(r'^[^AEIOU].*[^aeiou]$')

如果它以辅音开头和结尾,则此操作返回原始元素,否则返回一个空列表。我认为^运算符代表元音的否定。*运算符结合元音大小写的情况。然而,我不了解其余的运营商。

请帮助我理解这些输入表达式。提前致谢。

4

2 回答 2

3

第一个^表示在字符串的开头,而$表示在字符串的末尾,这里是一个例子:

>>> import re
>>> s = 'a123a'
>>> re.findall('^a', s)
['a']
>>> 

这只会打印一个a,因为我的^符号只能在字符串的乞求中找到。

这与 相同$$仅从字符串末尾查找内容,这是一个示例:

>>> import re
>>> s = 'a123a'
>>> re.findall('a$', s)
['a']
>>> 

编辑:

的含义r是一个原始字符串。原始字符串就是它的样子。例如,反斜杠\不会转义,它只是一个常规的反斜杠。

于 2020-12-20T05:10:23.510 回答
1

你的第一个例子:

'([A-Za-z]+)'

指由“()”标记的组,其中包含大小写字符的任意组合(方括号之间的值)。括号后面的 + 符号表示您需要其中的一个或多个。所以它基本上匹配任何字母组合,直到找到一个“非”字母,在你的情况下,这将是名字和姓氏之间的空格。因此,正则表达式返回每行的名字。

对于您的第二个示例:

'^[^AEIOU].*[^aeiou]$'

第一个 ^ 表示字符串的开头,然后方括号中的第二个 ^ 表示您提到的否定(因此匹配除方括号中的内容之外的任何内容)。所以这里的第一部分意味着你的匹配应该以大写的非元音开头。然后是 .* ,其中 '.' 表示任何字符(换行符除外;因此这不再与您的辅音相关)并且“*”表示它们的零个或多个值。到目前为止,您的正则表达式是说:以大写的非元音开头,后跟任意字母组合。最后一部分:'[^aeiou]$' 表示你的字符串应该以小写的非元音结尾。这是由代表字符串结尾的 $ 符号决定的。

所以是的,在这里您实际上只返回以大写辅音开头并以小写辅音结尾的匹配项。

于 2020-12-20T05:26:53.030 回答