簡體   English   中英

Python正則表達式可匹配任何包含正好為n位數字的單詞,但也可以包含其他字符

[英]Python regex that matches any word that contains exactly n digits, but can contain other characters too

例如,如果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*\\d\\D*\\d\\D*\\d\\D*\\d\\D*\\d\\D*\\d\\D*\\d\\D*\\d\\D*\\d\\D*\\d\\D*$將找到所有匹配項。 將其更改為可以使用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*\d\D*){%d}$" % n, re.MULTILINE)
result = rgx.findall(txt)
print(result)

印刷品:

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

此表達式可能會驗證10位數字:

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

我們可以簡單地用n var替換10。

regex101.com的右上角對表達式進行了說明,如果您希望對其進行探索/簡化/修改,並且在此鏈接中 ,您可以根據需要觀看它與某些示例輸入的匹配方式。

測試

import re

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

輸出量

['a1b2c3ddd4e5ff6g7h8i9jj0k']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM