Python 正则表达式匹配任何包含正好 n 位数字的单词,但也可以包含其他字符



例如,如果 n=10,则正则表达式:

应匹配:

(123)456-7890
(123)456-(7890)
a1b2c3ddd4e5ff6g7h8i9jj0k

但不应匹配:

(123)456-789
(123)456-(78901)
etc.

注意:我严格寻找正则表达式,这是一个硬约束。

====

=====================================

编辑:其他约束

我正在寻找以下形式的解决方案:

regex = re.compile(r'?????????')

哪里:

regex.findall(s)

。返回 ['(123(456-7890','(123(456-(7890(', 'a1b2c3ddd4e5ff6g7h8i9jj0k'] 中的 s 的非空数组

并返回 ['(123(456-789', '(123(456-(78901('] 中 s 的空数组

则表达式^D*dD*dD*dD*dD*dD*dD*dD*dD*dD*dD*$将找到所有匹配项。将其更改为适用于n数字使用 "^"+"D*d"*n+"D*$"

import re
n=10
regex = "^"+"D*d"*n+"D*$"
numbers='''(123)456-7890
(123)456-(7890)
a1b2c3ddd4e5ff6g7h8i9jj0k

(123)456-789
(123)456-(78901)'''
matches=re.findall(regex,numbers,re.M)
print(matches)

或者对于单场比赛

pattern = re.compile("^"+"D*d"*n+"D*$")
print(pattern.match('(123)456-7890').group(0)) #(123)456-7890 or AttributeError if no match so wrap in try except

只需替换输入字符串中的所有非数字字符:

import re
def ensure_digits(s, limit=10):
    return len(re.sub(r'D+', '', s)) == limit
print(ensure_digits('(123)456-(7890)', 10))             # True     
print(ensure_digits('a1b2c3ddd4e5ff6g7h8i9jj0k', 10))   # True
print(ensure_digits('(123)456-(78901)', 10))            # False
  • D+ - 匹配一个或多个非数字字符

单词列表的版本:

def ensure_digits(words_lst, limit=10):
    pat = re.compile(r'D+')
    return [w for w in words_lst if len(pat.sub('', w)) == limit]
print(ensure_digits(['(123)456-7890','(123)456-(7890)', 'a1b2c3ddd4e5ff6g7h8i9jj0k'], 10))
print(ensure_digits(['(123)456-789', '(123)456-(78901)'], 10))

连续打印:

['(123)456-7890', '(123)456-(7890)', 'a1b2c3ddd4e5ff6g7h8i9jj0k']
[]

您可以使用字符串格式在模式中注入所需的数字n数量。此外,您需要使用标志MULTILINE

import re
txt = """(123)456-7890
(123)456-(7890)
a1b2c3ddd4e5ff6g7h8i9jj0k
(123)456-789
(123)456-(78901)"""
n = 10
rgx = re.compile(r"^(?:D*dD*){%d}$" % n, re.MULTILINE)
result = rgx.findall(txt)
print(result)

指纹:

['(123)456-7890', '(123)456-(7890)', 'a1b2c3ddd4e5ff6g7h8i9jj0k']

此表达式可能会验证 10 位数字:

^(?:D*d|dD*){10}D*$

我们可以简单地用 n var 替换 10。

如果您希望

探索/简化/修改表达式,可以在 regex101.com 的右上角面板上解释该表达式,在此链接中,如果您愿意,可以查看它如何与一些示例输入匹配。

测试

import re
print(re.findall(r"^(?:D*d|dD*){10}D*$", "a1b2c3ddd4e5ff6g7h8i9jj0k"))

输出

['a1b2c3ddd4e5ff6g7h8i9jj0k']

相关内容

最新更新