【问题标题】:Pandas string operations (extract and findall)Pandas 字符串操作(提取和查找)
【发布时间】:2020-12-20 05:06:36
【问题描述】:

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

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

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

【问题讨论】:

  • 对于#1,[A-Za-z] 代表大写或小写字母。 + 表示连续 1 个或多个。 [A-Za-z]+ 一起表示 1 个或多个连续字母。 () 是您要返回的捕获组,默认情况下,str.extract() 将返回第一个捕获组。作为如何返回姓氏的示例,您可以使用monte.str.extract('\s+([A-Za-z]+)'),其中\s+ 是一个或多个连续空格。请注意,它在捕获组之外,但有空格,这意味着它必须捕获姓氏,因为名字之前没有空格。

标签: python regex pandas string-operations


【解决方案1】:

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

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

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

$ 也是如此,$ 只查找字符串末尾的内容,这是一个示例:

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

已编辑:

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

【讨论】:

【解决方案2】:

你的第一个例子:

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

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

第二个例子:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多