【问题标题】:regex for only alphanumeric without underscores [duplicate]正则表达式仅用于不带下划线的字母数字 [重复]
【发布时间】:2020-01-18 12:18:37
【问题描述】:

我有一个文本字符串如下:

text = "907525191737280e , hjjhkj789jkh 2554nagy289 2 8 2 2 7 5 2 working welcome , a dp83640as25 , dp83867 e2 e25"

我尝试使用以下正则表达式(来自:regex for alphanumeric only is not working)仅识别字母数字单词。

并将其更改为:^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]* 但我没有得到我想要的结果,我也尝试了[a-zA-Z0-9]+ 但它也失败了。

期望的输出:

907525191737280e hjjhkj789jkh 2554nagy289 dp83640as25 dp83867 e2 e25

我是正则表达式的新手,正在努力学习它。你能帮我看看我错过了什么吗?

【问题讨论】:

  • 为什么简单的2被拒绝了?在我的书中是字母数字...

标签: python regex


【解决方案1】:

一种选择是使用前瞻检查数字并匹配至少一个字符 a-zA-Z。

您不需要锚点^,因为它断言了字符串的开头。您可以使用单词 bounary \b 来确保匹配不是更大单词的一部分。

\b(?=[a-zA-Z0-9]*[0-9])[a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]*\b

部分

  • \b字边界
  • (?=[a-zA-Z0-9]*[0-9]) 正向前瞻,断言一个数字
  • [a-zA-Z0-9]*[a-zA-Z][a-zA-Z0-9]* 在所有允许的字符之间匹配一个字符 a-zA-Z
  • \b字边界

Regex demo

【讨论】:

    【解决方案2】:

    如果您只需要包含至少一个数字字符和至少一个字母字符的所有单词,则可以使用import string 而不是import re 来完成以下方式:

    import string
    text = "907525191737280e , hjjhkj789jkh 2554nagy289 2 8 2 2 7 5 2 working welcome , a dp83640as25 , dp83867 e2 e25"
    words = text.split()
    anwords = [w for w in words if set(w).intersection(string.ascii_letters) and set(w).intersection(string.digits)]
    print(anwords)  # ['907525191737280e', 'hjjhkj789jkh', '2554nagy289', 'dp83640as25', 'dp83867', 'e2', 'e25']
    

    请注意,此解决方案类似于您仅将 ASCII 字母识别为字母的模式。请记住,re 是有用的模块,但有些任务通过其他方式更容易完成。

    【讨论】:

      【解决方案3】:

      只是说 - 不需要正则表达式,真的:

      text = "907525191737280e , hjjhkj789jkh 2554nagy289 2 8 2 2 7 5 2 working welcome , a dp83640as25 , dp83867 e2 e25"
      
      alnums = [word
                for word in text.split()
                if word.isalnum()]
      
      print(alnums)
      

      这会产生

      ['907525191737280e', 'hjjhkj789jkh', '2554nagy289', '2', '8', '2', '2', '7', '5', '2', 'working', 'welcome', 'a', 'dp83640as25', 'dp83867', 'e2', 'e25']
      


      如果需要,添加其他条件(例如长度):
      alnums = [word
                for word in text.split()
                if word.isalnum() and len(word) > 1]
      

      这会产生

      ['907525191737280e', 'hjjhkj789jkh', '2554nagy289', 'working', 'welcome', 'dp83640as25', 'dp83867', 'e2', 'e25']
      

      【讨论】:

        猜你喜欢
        • 2014-01-31
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        相关资源
        最近更新 更多