问题:
我写了一个正则表达式来识别文本中的电子邮件地址。但它没有识别出像-
这样的特殊字符的电子邮件。所以我修改了正则表达式以匹配带有特殊字符的电子邮件。现在它不匹配正常email.s
regex = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?"
TEXT ="要解析的地址是bilgi"
DETECT = "bilgi@kleintoys.com"
NOT_DETECT = "bilgi@klei-ntoys.com"
修改:
regex = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\-+\w+\.\w+)\"?"
TEXT ="要解析的地址是bilgi"
DETECT = "bilgi@klei-ntoys.com"
NOT_DETECT = "bilgi@kleintoys.com"
是否有正则表达式结合这两个正则表达式来匹配两个电子邮件。 喜欢
bilgi@klei-ntoys.com
bilgi@kleintoys.com
答案 0 :(得分:1)
你可以制作一个更宽松的正则表达式。 这是一个匹配两个地址的命题:
[a-zA-Z\d]+@.+\..{,3}
让我们分解一下:
[a-zA-Z\d]+@.+\.[a-zA-Z\d]{,3}
[a-zA-Z\d] Match any alphanumerical character...
+ ... at least once
@ Match the arobase
.+ Match any character at least once...
\. ... before a dot
[a-zA-Z\d]{,3} Then check at least three alphanumerical characters
使用Python检查:
>>> import re
>>> s = "bilgi@kle-intoys.com"
>>> re.match("[a-zA-Z\d]+@.+\.[a-zA-Z\d]{,3}", s)
<_sre.SRE_Match object; span=(0, 20), match='bilgi@kle-intoys.com'>
>>> s = "bilgi@kleintoys.com"
>>> re.match("[a-zA-Z\d]+@.+\.[a-zA-Z\d]{,3}", s)
<_sre.SRE_Match object; span=(0, 19), match='bilgi@kleintoys.com'>
答案 1 :(得分:1)
要使您的模式有效,您需要添加一个与-
的0 +序列匹配的部分,然后添加一个或多个单词字符(?:-\w+)*
:
"?([-a-zA-Z0-9.`?{}]+@\w+(?:-\w+)*\.\w+)"?
^^^^^^^^^
请参阅regex demo。
<强>详情
"?
- 可选的"
([-a-zA-Z0-9.`?{}]+@\w+(?:-\w+)*.\w+)
- 第1组(re.findall
将输出的内容):
[-a-zA-Z0-9.`?{}]+
- 字符类中定义的一个或多个字符(-
,ASCII字母,数字,.
,`
,?
,{{ 1}},{
(请注意,您可能希望将此部分限制为以任何字母开头,然后匹配}
,例如_
)[^\W\d_][-\w.`?{}]*
- @
@
- 1个或多个字母/数字/ \w+
_
- 0 + (?:-\w+)*
的序列,然后是1个或多个字母/数字/ -
_
- 一个点\.
- 1个或多个字母/数字/ \w+
_
- 可选的"?
"
答案 2 :(得分:0)
使用ipdb.pm()
代替*
:
+
连字符匹配零次或多次后的星号。你有一个加号,至少匹配一个连字符。顺便说一下,您可以使用r"\"?([-a-zA-Z0-9.`?{}]+@\w+\-*\w+\.\w+)\"?"
代替\-*
。在方括号之间,可以插入除[-]*
之外的任何其他特殊字符。