仅适用于字母数字且不带下划线的正则表达式

2024-10-03 11:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我尝试使用以下正则表达式(from: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

我对regex还不熟悉,正在努力学习。你能帮我一下吗?我错过了什么


Tags: 字符串textfrom文本forregexworkingwelcome
3条回答

如果您只需要包含至少一个数字字符和至少一个字母字符的所有单词,可以通过以下方式使用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是一个有用的模块,但是有些任务更容易用另一种方式完成

一个选项是使用前瞻检查一个数字,并至少匹配一个字符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

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

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']

相关问题 更多 >