[英]Python regex to match a pattern that starts with word, end with 4 digits, contain no special characters except @ and % and have atleast 10 characters
[英]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.