带有Pandas的REGEX过滤器(任何数字组合后跟'加号')

时间:2018-01-13 04:10:35

标签: python regex pandas

我有一个名为df的Pandas数据框,其中包含以下3列:idcreation_dateemail

我想返回 email 列包含任何严格数字组合(必须是严格数字)的所有行,后跟一个“加号”,然后是任何内容。

例如:
- 1345677+@gmail.com2345678+556@gmail.com符合我的标准 - Testing+22@gmail.comtest223+22@gmail.com不会,因为它们在“加号”前包含非数字字符。

我知道df.email.str.contains('\+')无效,因为它会返回包含“加号”符号的所有内容。我曾尝试df.filter(['email'], regex=r'([^0-9])' % '\+', axis=0),但它抛出了一条错误消息,内容为TypeError: not all arguments converted during string formatting

有人可以提供建议吗?

非常感谢!

4 个答案:

答案 0 :(得分:4)

您可以使用contains,但match就足够了:

# example data
data = ["1345677+@gmail.com", "2345678+556@gmail.com", 
        "Testing+22@gmail.com", "test223+22@gmail.com"]
df = pd.DataFrame(data, columns=["email"])

df
                   email
0     1345677+@gmail.com
1  2345678+556@gmail.com
2   Testing+22@gmail.com
3   test223+22@gmail.com

现在使用match

df.email.str.match("\d+\+.*")

0     True
1     True
2    False
3    False
Name: email, dtype: bool

请注意文档中的containsmatch之间的区别:

  

<强>包含
  类似但不太严格,依赖于re.search而不是re.match

答案 1 :(得分:1)

试试这个:

df.email.str.contains('^\d+\+\@')

分解正则表达式:

^确保我们从电子邮件字符串的开头

开始

\d+仅捕获数字(数字)字符1到很多次

\+转义加号以确保匹配

\@转义@并确保之前匹配的加号出现在@

之前的电子邮件末尾

答案 2 :(得分:1)

由于您的组合后跟+,后面可能跟着数字,您可以尝试使用以下正则表达式。

正则表达式: (?:\d+\+?)+@[a-z]+\.[a-z]+

<强>解释

  • (?:\d+\+?)+符合您的digit``+模式。

  • [a-z]+\.[a-z]+将与剩余部分匹配。

<强> Regex101 Demo

答案 3 :(得分:1)

正则表达式^\d+\+\d*@\S+

enter image description here

<强>详情:

^在行的开头声明位置

\d+匹配一个数字(等于[0-9])

\+匹配字符+字面

\d*匹配一个数字(等于[0-9]),*量词 - 零和无限次之间的匹配

@匹配字符@

\S+匹配任何非空格字符

Regex demo