我刚开始使用python的正则表达式,我以为我理解了这个概念,但是当我开始编程时,却无法理解。给出的问题说明是设计一个正则表达式
我写的代码是
import re
n=int(input())
patt=r'^(?=.*[A-Z]).{2,}(?=.*[0-9]).{3,}(?=.*[\w]?){10}$'
for x in range(n):
match=re.findall(patt,str(input()))
#print(match)
if match:
print("Valid")
else:
print("Invalid")
我首先从第一部分开始,即应包含“ 它必须包含至少2个大写英文字母字符”,为此我写了(?=.*[A-Z]).{2,}
,因为它将搜索两个以上字符,并将使用超前断言
对于第二部分,我应用了相同的内容,对于第三部分,即它应该只包含字母数字字符,我应用了(?=.*[\w]?)
,这三个方法似乎都有效,但是当第四个和第五个条件出现时,即请勿重复输入任何字符和必须恰好有10个字符。我最终尝试使用{10}
,但此操作无效,整个内容似乎已经坏了。谁能指导我如何使用正则表达式以及正向预测是什么。
答案 0 :(得分:3)
您可以将此正则表达式与3个先行断言一起使用,以满足您的所有条件:
^(?=(?:[a-z\d]*[A-Z]){2})(?=(?:\D*\d){3})(?:([a-zA-Z\d])(?!.*\1)){10}$
RegEx说明:
^
:开始(?=(?:[a-z\d]*[A-Z]){2})
:先行断言我们至少有2个大写字母(?=(?:\D*\d){3})
:先行断言我们至少有3位数字(?:([a-zA-Z\d])(?!.*\1)){10}
:精确匹配10个字母数字字符。负向前瞻是断言我们在任何地方都没有重复任何内容。$
:结束Read more about look aheads and look behinds
代码:
reg = re.compile(r'^(?=(?:[a-z\d]*[A-Z]){2})(?=(?:.*\d){3})(?:([a-zA-Z\d])(?!.*\1)){10}$')
arr = ['A1b2c3d4eF', 'B1CDEF2354', 'aBcDdef122', 'B1CD102354', 'a1bcf2coqb', 'a1bcf2oo3b', '1234567890']
for i in arr:
print i, reg.match(i)
答案 1 :(得分:1)
import re
n = int(input())
patt = r'^(?=(?:[a-z\d]*[A-Z]){2})(?=(?:\D*\d){3})(?:([a-zA-Z\d])(?!.*\1)){10}$'
for x in range(n):
match=re.match(patt,str(input()))
if match:
print("Valid")
else:
print("Invalid")
答案 2 :(得分:0)
任何字符都不能重复条件: regex to match a word with unique (non-repeating) characters
精确匹配字符数条件: Regular expression to match exact number of characters?
必须包含条件: Regex must contain specific letters in any order
应仅包含条件:从您已经自行解决的问题来看。
剩下的工作是将它们合并在一起,如果这是练习的一部分,那么您应该自己做。