【问题标题】:python: regex match string and only string [duplicate]python:正则表达式匹配字符串,只有字符串[重复]
【发布时间】:2015-12-01 20:19:00
【问题描述】:

我正在尝试在 python 中创建一个小型文本限制程序。基本上,用户输入文本、一些过滤器(a 表示字母,n 表示数字等)。用户可以组合过滤器(a 和 n 用于字母数字等),但我偶然发现了这一点:

if re.match("[a-zA-Z]", textToRestrict):
    return True
else:
    return False

这就是事情分崩离析的地方。假设只有字母作为过滤器,程序将只接受字符串,例如dance。但是,如果 textToRestricdance1234(不正确),if 语句仍然返回 true,而 1234dance 将返回 false(正确)。

相反,如果我通过[0-9] 测试数字,即使它包含字母字符,它仍会返回true,前提是这些字符不是第一个。

如何使用正则表达式仅匹配某种类型,并以这样的方式添加另一种类型(如类型字符串 + 类型数字)允许两种类型返回 true

更新:这是我用于多个过滤器的方法:

regex = ""
if FilterClass.ALPHABETIC in arguments:
    regex += "[a-zA-Z]"
if FilterClass.CAPITAL_ALPHABETIC in arguments:
    regex += "[A-Z]"
if FilterClass.NUMERIC in arguments:
    regex += "\d"
if FilterClass.SPECIAL_CHARACTERS in arguments:
    regex += "[^0-9a-zA-Z]*"
if FilterClass.DASH_UNDERSCORES in arguments:
    regex += "[-_]*"            

regall = "^(" + regex + ")+$"

if re.match(regall, textToRestrict):
    return True
else:
    return False

arguments是用户输入的参数。 if 语句检查其中的内容,并且据说会向正则表达式字符串添加更多模式。

【问题讨论】:

  • 为什么不使用str.isalpha()str.isdigit()
  • 您的正则表达式不会在位置上检查它在字符串中的位置,并且不匹配超过第一个字符 ^[a-zA-Z]+$ 从头到尾匹配的任何内容,一个或多个匹配出现的字母直到字符串的结尾。
  • @SirParselot,因为理想情况下,用户可以输入字母、数字、特殊字符或这些字符的任意组合,只要他们使用适当的过滤器。我不确定isalpha()isdigit() 是否可以用于此目的。

标签: python regex string


【解决方案1】:

在正则表达式的两端添加anchors,加上一个量词(+,如果你想排除空字符串;*,如果你想允许空字符串)。现在,您只是检查第一个字符(单数)是否为字母(即匹配 [a-zA-Z])。

你想要的是:

re.match("^[a-zA-Z]+$", textToRestrict)

(或者,如果您的过滤器真的这么简单,请考虑改用 str.isalpha 之类的字符串方法,as SirParselot suggests in a comment。)

【讨论】:

  • 如果您使用match() 进行测试,则不需要左锚。
  • @Felk 严格来说,你是对的 - 它不是。无论如何,为了明确起见,我宁愿把它放在那里。
  • 这对一个人有用,谢谢。如果将其视为字符串,我可以添加到该模式,还是需要在最后添加+$?为了清楚起见,我更新了我上面的帖子,以显示我目前的工作方式。
  • @zack_falcon + 的意思是“匹配我面前的东西 1 次或多次”。 $ 表示“匹配字符串的结尾”。如果你想匹配字母数字,如果你想使用正则表达式,你需要^[0-9a-zA-Z]+$ 之类的东西。如果您想逐个构建这些正则表达式,则需要使用 [0-9]|[a-zA-Z] 之类的替代方法,然后将其包装在 ^(...)+$ 中。
  • 管道不是或吗?这是否意味着它会检查是否有 [0-9][a-zA-Z] 直到结束?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2011-11-28
  • 1970-01-01
  • 2023-03-09
  • 2020-05-10
相关资源
最近更新 更多