Python正则表达式匹配包含字母和数字的8个字符的字符串

2024-04-24 18:38:25 发布

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

我正在尝试使用re.findall匹配一个长度为8的字符串,该字符串同时包含数字和字母(不能只有数字或字母)。字符串可以以字母或字母开头,后跟任意组合

例如:

输入字符串:The reference number is 896av6uf and not 87987647 or ahduhsjs or hn0.

输出:['896av6uf','a96bv6u0']

我提出了这个正则表达式r'([a-z]+[\d]+[\w]*|[\d]+[a-z]+[\w]*)',但是它也给了我少于8个字符的字符串。 需要修改正则表达式以返回包含字母和字母的8个字符的字符串


Tags: orandthe字符串renumberis字母
3条回答

你可以用

\b(?=[a-zA-Z]*[0-9])(?=[0-9]*[a-zA-Z])[a-zA-Z0-9]{8}\b
\b(?=[^\W\d_]*\d)(?=\d*[^\W\d_])[^\W_]{8}\b

第一个只支持ASCII字母,而第二个支持所有Unicode字母和数字,因为[^\W\d_]匹配任何Unicode字母,\d匹配任何Unicode数字(因为在Python 3.x中默认使用re.UNICODE选项)

详情:

  • \b-单词边界
  • (?=[a-zA-Z]*[0-9])-在任何0+ASCII字母之后,必须有一个数字
  • (?=[0-9]*[a-zA-Z])-在任何0+位之后,必须有一个ASCII字母
  • [a-zA-Z0-9]{8}-八个ASCII字母数字字符
  • \b-单词边界

您可以使用\b\w{8}\b

它不能保证您同时拥有数字和字母,但可以保证您正好拥有八个字符,周围有单词边界(例如空格、行首/行尾)

你可以在这样的一个在线游乐场中尝试:https://regex101.com/

enter image description here

匹配的核心是\w{8},意思是8个字母/单词(包括大写字母和下划线)\b表示“单词边界”

如果只需要数字和小写字母,请将其替换为\b[a-z0-9]{8}\b

然后,您可以进一步检查数字和字母是否存在,例如,使用filter

list(filter(lambda s: re.search(r'[0-9]', s) and re.search(r'[a-z]', s), result))

result是您从re.findall()获得的

所以底线是,我会使用:

list(filter(lambda s: re.search(r'[0-9]', s) and re.search(r'[a-z]', s), re.findall(r'\b[a-z0-9]{8}\b', str)))

首先,让我们查找一个语句,该语句查找由小写字母和8个字符长的数字组成的单词:

\b[a-z\d]{8}\b

下一个条件是单词必须同时包含字母和数字:

[a-d]\d

现在进入挑战部分,将这些组合成一个语句。最简单的方法可能是直接吐出来,但我们可以使用一些look aheads来实现这一点:

\b(?=.*[a-z]\d)[a-z\d]{8}\b

我相信有一个更整洁的方式来做这件事,但这将工作

相关问题 更多 >