如果特定字符出现特定次数,则使用正则表达式进行匹配

2024-09-28 01:33:27 发布

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

我正在尝试使用正则表达式来检查字符串str是否至少包含两个数字,并且正好包含以下任意符号中的两个:“!”、“@”、“#”、“美元”、“%”和“&;','*'

似乎正在发生的是,我只在它们连续出现而不是全部出现时才匹配。我该如何解决这个问题

str = 'a1b2c$3d#4e!f@ghi0'

sym = '[!@#$%&*]{2}'
num = '[0-9]{2,}'

for char in str:
    if re.search(sym, str):
        if re.search(num, str):
            print('match!')
        else:
            print('no matches!')

Tags: 字符串reforsearchif符号数字num
1条回答
网友
1楼 · 发布于 2024-09-28 01:33:27

如果您想使用2种模式,则不必循环检查每个字符。在sym中,您可以检查字符串是否正好包含列出的两个字符

num中,您至少可以匹配两位数字

import re

str = 'test$test$test123'

sym = r'^[^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*\Z'
num = r'^[^\d\r\n]*\d[^\d\r\n]*\d'

if re.search(sym, str) and re.search(num, str):
    print('match!')
else:
    print('no matches!')

您还可以将单个模式与re.match一起使用

^(?=[^\d\r\n]*\d[^\d\r\n]*\d)[^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*\Z

解释

  • ^字符串的开头
  • (?=[^\d\r\n]*\d[^\d\r\n]*\d)正向前瞻,断言2个数字
  • [^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*精确匹配列出的任何字符中的2个
  • \Z字符串的结尾

Regex demoPython demo

import re

str = 'test$test$test123'
pattern = r'(?=[^\d\r\n]*\d[^\d\r\n]*\d)[^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*[!@#$%&*][^!@#$%&*\r\n]*\Z'
if re.match(pattern, str):
    print('match!')
else:
    print('no matches!')

在不使用正则表达式的情况下,一个选项是计算数字和特殊字符的出现次数:

s = 'test$test$test123'
specialChars = "!@#$%&*"
num = 0
sym = 0

for char in s:
    if char.isdigit():
        num += 1
    if char in specialChars:
        sym += 1

if num > 1 and sym == 2:
    print("Match")

Python demo

相关问题 更多 >

    热门问题