正则表达式Python,至少3个大写字母

时间:2019-12-23 13:11:57

标签: python regex

我需要一个匹配不能包含数字的字符串的正则表达式。该字符串应至少包含3个大写字母。此外,该字符串应包含6至40个字符。

这是我的方法,但是它不起作用,正如我期望的那样:

re.findall("\\n(?=(?:[^A-Z]*[A-Z]){3})[^0-9]{6,40}:\\n",text, flags=re.MULTILINE)

1 个答案:

答案 0 :(得分:0)

最好用ComputerName=$(scutil --get ComputerName) LocalHostName=$(scutil --get LocalHostName) (在正确的轨道上)完成。它们断言输入在当前扫描点必须包含或必须包含的内容,而不会实际消耗(匹配)任何字符:

lookahead assertions
  1. ^(?!\D*\d)(?=([^A-Z]*[A-Z]){3}).{6,40}$ 匹配字符串的开头(使用^时多余,因为这是隐含的。)
  2. re.match断言,此时输入中没有数字。
  3. (?!\D*\d)断言此时输入中有3个大写字母。
  4. (?=([^A-Z]*[A-Z]){3})匹配换行符以外的任何6-40个字符。
  5. .{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
  1. ^(?!.*\d)(?=(?:.*[A-Z]){3}).{6,40}$ 匹配字符串的开头或行的开头。
  2. ^断言输入中没有数字,但是使用(?!.*\d)而不是.*可以确保我们不会扫描到行尾。
  3. \D同样确保在行尾之前输入3个大写字母。
  4. (?=(?:.*[A-Z]){3})匹配换行符以外的任何6-40个字符。
  5. .{6,40}匹配行尾或字符串尾。

Regex demo

代码:

$

打印:

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*不会假设您没有设置.*标志