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

Python正则表达式,它匹配任何恰好包含n个数字的单词,但也可以包含其他字符,python,regex,Python,Regex,e、 g.如果n=10,则正则表达式: 应匹配: (123)456-7890 (123)456-(7890) a1b2c3ddd4e5ff6g7h8i9jj0k 但不应匹配: (123)456-789 (123)456-(78901) etc. 注意:我严格地寻找正则表达式,这是一个硬约束 ====================================== 编辑:其他约束 我正在寻找以下形式的解决方案: regex = re.compile(r'?????????') 其中: r

e、 g.如果n=10,则正则表达式:

应匹配:

(123)456-7890
(123)456-(7890)
a1b2c3ddd4e5ff6g7h8i9jj0k
但不应匹配:

(123)456-789
(123)456-(78901)
etc.
注意:我严格地寻找正则表达式,这是一个硬约束

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

编辑:其他约束

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

regex = re.compile(r'?????????')
其中:

regex.findall(s)
。。。返回['123456-7890'、'123456-7890'、'A1B2C3DDD4E5FF6G7H8I9J0K']中s的非空数组


并返回['123456-789','123456-78901']中s的空数组。

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

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']
[]

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

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位数使用^+\D*\D*n+\D*$

还是一场比赛

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
正则表达式将查找所有匹配项。将此更改为适用于n位数使用^+\D*\D*n+\D*$

还是一场比赛

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

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

印刷品:

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

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

印刷品:

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

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

^(?:\D*\d|\d\D*){10}\D*$
我们可以简单地用n变量替换10

如果您希望探索/简化/修改该表达式,将在的右上面板中对其进行解释。在中,如果您愿意,可以查看它与一些示例输入的匹配情况

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

^(?:\D*\d|\d\D*){10}\D*$
我们可以简单地用n变量替换10

如果您希望探索/简化/修改该表达式,将在的右上面板中对其进行解释。在中,如果您愿意,可以查看它与一些示例输入的匹配情况

测验 输出
数字总是有序的吗?您尝试过吗?您能提供您的尝试吗?@depperm数字并非总是按递增顺序排列的。我尝试重新编译“\b[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d]*?\b”,但这不起作用。@Romankhrest例如:ccc=re.compiler'\bccc\b'将不匹配'。然而,ccc.findall'ccc'将产生['ccc']数字总是有序的吗?您尝试过吗?您能提供您的尝试吗?@depperm数字并非总是按递增顺序排列的。我尝试重新编译“\b[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d[^\s\d]*?\d]*?\b”,但这不起作用。@Romankhrest例如:ccc=re.compiler'\bccc\b'将不匹配'。然而,ccc.findall'ccc'将产生['ccc'],这不是完成任务的正则表达式。这是一个围绕正则表达式的函数,如果不调用该函数,您的解决方案将无法工作。有关更明确的约束,请参见上面的“我的编辑”。这不是完成任务的正则表达式。这是一个围绕正则表达式的函数,如果不调用该函数,您的解决方案将无法工作。有关更明确的约束,请参见上面的编辑。使用nine=re.compiler^\D*\D\D*\D\D*\D*\D\D*\D*\D\D*\D*\D\D*\D*\D*$,nine.findall'12345-6789'生成空数组。@JamesShapiro是的,我做了一次编辑以处理n个数字,我忘了问题是处理n个不是10个数字这对字符串有效,但对单词无效。十.findall'12345-67890'在不应该的时候找到了匹配项。我认为pattern=re.compile^+[^\s\d]*\d*n+[^\s\d]*$trickwith nine=re.compiler^\d*\d\d*\d\d*\d\d*\d\d*\d*\d*\d*\d*\d*\d\d*$,九个。findall'12345-6789'生成空数组。@Jamessiro是的,我编辑了n个数字,我忘了这个问题是针对n而不是10个数字的。这适用于字符串,但不适用于单词。十、findall'12345-67890'在不应该匹配的情况下找到匹配项。我认为pattern=re.compile^+[^\s\d]*\d*n+[^\s\d]*$有什么诀窍实际问题是关于n位的实际问题是关于n位的