Pandas 字符串操作extract 和 findall

问题描述

以下是 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]$')

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

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

解决方法

第一个 ^ 表示在字符串的开头,而 $ 表示在字符串的结尾,示例如下:

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

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

$ 也是如此,$ 只从字符串的末尾开始查找内容,示例如下:

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

已编辑:

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

,

你的第一个例子:

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

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

第二个例子:

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

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

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