我需要一个匹配不能包含数字的字符串的正则表达式。该字符串应至少包含3个大写字母。此外,该字符串应包含6至40个字符。
这是我的方法,但是它不起作用,正如我期望的那样:
re.findall("\\n(?=(?:[^A-Z]*[A-Z]){3})[^0-9]{6,40}:\\n",text, flags=re.MULTILINE)
答案 0 :(得分:0)
最好用ComputerName=$(scutil --get ComputerName)
LocalHostName=$(scutil --get LocalHostName)
(在正确的轨道上)完成。它们断言输入在当前扫描点必须包含或必须包含的内容,而不会实际消耗(匹配)任何字符:
lookahead assertions
^(?!\D*\d)(?=([^A-Z]*[A-Z]){3}).{6,40}$
匹配字符串的开头(使用^
时多余,因为这是隐含的。)re.match
断言,此时输入中没有数字。(?!\D*\d)
断言此时输入中有3个大写字母。(?=([^A-Z]*[A-Z]){3})
匹配换行符以外的任何6-40个字符。.{6,40}
匹配字符串的结尾。代码:
$
打印:
import re
strings = [
'abcDefGdjIj', # OK
'abcDefdjIj', # not enough uppercase
'DGdIj', # too short
'abcDef7GdjIj' # has a digit
]
for string in strings:
print(string, re.match(r'^(?!\D*\d)(?=([^A-Z]*[A-Z]){3}).{6,40}$', string))
如果要使用abcDefGdjIj <_sre.SRE_Match object; span=(0, 11), match='abcDefGdjIj'>
abcDefdjIj None
DGdIj None
abcDef7GdjIj None
在多行字符串中搜索多个有效匹配项,则应使用带有标志re.findall
的以下正则表达式:
re.MULTILINE
^(?!.*\d)(?=(?:.*[A-Z]){3}).{6,40}$
匹配字符串的开头或行的开头。^
断言输入中没有数字,但是使用(?!.*\d)
而不是.*
可以确保我们不会扫描到行尾。\D
同样确保在行尾之前输入3个大写字母。(?=(?:.*[A-Z]){3})
匹配换行符以外的任何6-40个字符。.{6,40}
匹配行尾或字符串尾。代码:
$
打印:
import re
strings = """abcDefGdjIj
abcDefdjIj
DGdIj
XYZabcDefGdjIj
abcDef7GdjIj"""
print(re.findall(r'^(?!.*\d)(?=(?:.*[A-Z]){3}).{6,40}$', strings, flags=re.MULTILINE))
为什么有两种正则表达式?在第一种情况下,我们只匹配单个字符串,并且要确保输入不包含数字,我们可以使用['abcDefGdjIj', 'XYZabcDefGdjIj']
或更通用的(?!\D*\d)
,但是第一个更有效率。但是,我们不能将其用于第二种多行(?!.*\d)
情况,因为findall
可以跨换行边界进行扫描,而\D*
不会假设您没有设置.*
标志