【问题标题】:Python regular expression to check alphanumericPython正则表达式检查字母数字
【发布时间】:2015-03-12 15:55:45
【问题描述】:

我使用下面的正则表达式来检查字符串是否包含字母数字,但我得到 result = None。

>>> r = re.match('!^[0-9a-zA-Z]+$','_')
>>> print r
None

【问题讨论】:

  • ! 在那里做什么?
  • ! - 我使用不等于。如果字符串不包含任何字母数字字符,则给我一个匹配对象。
  • 在跳转到正则表达式之前,我只会做def contains_alnum(s):return any(c.isalnum() for c in s)。如果您最终遇到性能瓶颈,那么一定要探索正则表达式选项。我不知道哪种方法会更快。

标签: python regex string python-2.7


【解决方案1】:

!在RegEx中没有任何特殊含义,你需要使用^来否定匹配,像这样

>>> re.match('^[^0-9a-zA-Z]+$','_')
<_sre.SRE_Match object; span=(0, 1), match='_'>

在 Python 2.x 中,

>>> re.match('^[^0-9a-zA-Z]+$','_')
<_sre.SRE_Match object at 0x7f435e75f238>

注意:这个正则表达式会给你一个匹配,只有当整个字符串都是非字母数字字符时。

如果要检查是否有任何字符是非字母数字,则需要使用re.search 并删除+$,像这样

>>> re.search('[^0-9a-zA-Z]', '123abcd!')
<_sre.SRE_Match object; span=(7, 8), match='!'>

这意味着在字符串中的任意位置查找除0-9a-zA-Z 之外的任何字符。 (re.match 将尝试从字符串的开头进行匹配。阅读更多关于 re.searchre.match here 之间的区别。

注意:这个问题的最佳解决方案是,使用str.isalnum,像这样

>>> "123abcdABCD".isalnum()
True
>>> "_".isalnum()
False

仅当整个字符串都包含字母数字字符时,才会返回 True。但是,如果您想查看字符串中是否有任何字符是字母数字,那么您需要像这样使用any 函数

>>> any(char.isalnum() for char in "_!@#%^$()*")
False
>>> any(char.isalnum() for char in "_!@#%^a()*")
True

【讨论】:

  • 您是否仍希望在搜索正则表达式中使用尾随 $?这不会强制它匹配字符串末尾的非字母数字,而不是任何地方吗?
  • @zebediah49 哎呀,对不起。这是没有必要的。我现在修好了。
【解决方案2】:

那是因为"_" 不匹配正则表达式并且没有返回任何内容。你可以简单地使用

def contains_alphanumeric( input):
   r=re.match('[0-9a-zA-Z]+', input)
   if r==None:
      return False
   else:
      return True

【讨论】:

    【解决方案3】:

    你没有具体提到你想用代码做什么,但我是正则表达式的粉丝,并且经常在我的代码中使用它们。它可能比其他一些选项使用更多的 CPU 周期,但我确实喜欢这种灵活性。

    如果您想单独查看每个字符,则将表达式的结果与原始字符串进行比较:

    import re
    
    def main():
        data = "This is a @#%(*ing string."
    
        match = re.findall(re.compile(r"[a-z0-9]",re.IGNORECASE),data)
    
        if len(match) != len(data):
            print("Uh-oh, spaghettios!")
        else:
            print("All good in the hood.")
    
    if __name__ == '__main__':
        main()
    

    这将使用 re.findall() 来匹配表达式并返回结果列表。在这个特定的例子中,只寻找 字母数字字符:

    >>> print(match)
    ['T', 'h', 'i', 's', 'i', 's', 'a', 'i', 'n', 'g', 's', 't', 'r', 'i', 'n', 'g']
    

    请记住,“[]”中的任何内容都将被视为文字字符,除非使用范围,并且您可以在 re.match() 中使用“()”来调用特定的结果组。

    请不要犹豫,提出更多问题或查看https://docs.python.org/2/library/re.html的“re”模块信息

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多