我正在尝试使用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个字符的字符串
你可以用
第一个只支持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/
匹配的核心是
\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个字符长的数字组成的单词:
下一个条件是单词必须同时包含字母和数字:
现在进入挑战部分,将这些组合成一个语句。最简单的方法可能是直接吐出来,但我们可以使用一些look aheads来实现这一点:
我相信有一个更整洁的方式来做这件事,但这将工作
相关问题 更多 >
编程相关推荐