【问题标题】:Python Regular Expression check if contains specific characters [duplicate]Python正则表达式检查是否包含特定字符[重复]
【发布时间】:2015-12-08 11:03:26
【问题描述】:

我正在尝试创建一个程序,用于检查电子邮件是否以小写字母开头、是否包含“@”符号以及“.com”或“.co.uk”。我该怎么做。

我的互联网很有趣,因此我无法在线查看表达方式。

这是我目前所拥有的:

def valid_email():
    email_address = input("Enter your email: ")
    valid = re.match("[a-z]",email_address)
    if valid:
        print("That looks OK")
    else:
        print("Invalid, must be lowercase and contain an '@' sign")
        valid_email()
valid_email()

【问题讨论】:

  • 你只是在寻找小写字母,所以我怀疑你需要担心检查,你不检查 @ 或者字符串以 .com 或 .co.uk 结尾
  • 有很多很多现有的电子邮件验证正则表达式 - 你有什么特别的原因想要推出自己的吗?在这些情况下,最好不要尝试重新发明轮子。
  • 这会对你有所帮助 - stackoverflow.com/questions/8022530/…

标签: python regex python-3.x


【解决方案1】:

你可以写一个正则表达式,比如valid = re.match(r"[a-z0-9]+@[a-z]+\.(com|co.uk)",email_address)

这将检查您的电子邮件是否遵循您提到的模式。

对于进一步的验证,例如以小写字母开头、包含“@”符号和“.com”或“.co.uk”,您可以设置类似的条件

     if '@' not in email_address:
       print "Must contain @" 

同样你可以设置各种条件。

【讨论】:

  • 您假设 localparts 不能包含点、加号、破折号或许多其他有效的标点字符。即使在大量常见的gmail.com 地址上,这也会失败(因为这些地址通常在本地部分的某个地方有一个点)。这在许多有效域名上也失败了——即使在 .com.co.uk TLD 内——以及任何带有子域的域名。
  • 我知道所有这些注意事项。我刚刚回答了上面关于他对电子邮件地址的期望的问题。
【解决方案2】:

话虽如此,您的代码会搜索 a-z 之间的任何字符并停止。 也就是说,如果地址是 blah@foo.co.uk,您的正则表达式将开始,看到开头有一个 'b' 匹配 [a-z] 并将停止。

改为使用'[a-z]+' 这将继续搜索,直到找到.
@ 符号是强制性的,因此应按原样放置。 现在正则表达式变为'[a-z]+@'
现在对于域的验证,使用:'[\w.]+[a-z]+'
因此,您的最终正则表达式语句(根据您的要求)变为:
re.match(r'[a-z]+@[\w.]+[a-z]+')

但以上是非常弱的正则表达式,并没有考虑到用户名字段中可能出现的_.。我强烈建议您使用已经可用于电子邮件验证的正则表达式,而不是尝试自己制作。

下面是完整电子邮件验证的正则表达式(对于 python):

r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)" (来自http://emailregex.com/

这是通用电子邮件正则表达式:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

【讨论】:

    【解决方案3】:

    您的正则表达式包含以下语句:

    • 只需 1 个“@”符号(可以写成“@”)
    • 开头有1个或多个“a-z”字母(可以写成[a-z]+)
    • “@”符号之前的任何内容(可以写为[^@]+)
    • “.com”或“.co.uk”的1个(可以写成.[^@]+)

    所以你的正则表达式应该是这样的:

    valid = re.match(r"[a-z]+[^@]+?\.[^@]+", email_address)
    

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 2017-05-03
      • 2014-04-25
      • 1970-01-01
      • 2018-08-09
      • 2019-08-15
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多