例如,如果 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']