我有一个名为df
的Pandas数据框,其中包含以下3列:id
,creation_date
和email
。
我想返回 email
列包含任何严格数字组合(必须是严格数字)的所有行,后跟一个“加号”,然后是任何内容。
例如:
- 1345677+@gmail.com
,2345678+556@gmail.com
符合我的标准
- Testing+22@gmail.com
和test223+22@gmail.com
不会,因为它们在“加号”前包含非数字字符。
我知道df.email.str.contains('\+')
无效,因为它会返回包含“加号”符号的所有内容。我曾尝试df.filter(['email'], regex=r'([^0-9])' % '\+', axis=0)
,但它抛出了一条错误消息,内容为TypeError: not all arguments converted during string formatting
。
有人可以提供建议吗?
非常感谢!
答案 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
请注意文档中的contains
和match
之间的区别:
<强>包含强>
类似但不太严格,依赖于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+
<强>详情:
^
在行的开头声明位置
\d+
匹配一个数字(等于[0-9])
\+
匹配字符+字面
\d*
匹配一个数字(等于[0-9]),*
量词 - 零和无限次之间的匹配
@
匹配字符@
\S+
匹配任何非空格字符