簡體   English   中英

Python正則表達式匹配包含字母和數字的8個字符的字符串

[英]Python regex match string of 8 characters that contain both alphabets and numbers

我正在嘗試使用re.findall匹配包含數字和字母(不能只有數字或只有字母)的長度為 8 的字符串。 字符串可以以字母或字母開頭,后跟任意組合。

例如-

輸入字符串: The reference number is 896av6uf and not 87987647 or ahduhsjs or hn0.

輸出: ['896av6uf','a96bv6u0']

我想出了這個正則表達式r'([az]+[\\d]+[\\w]*|[\\d]+[az]+[\\w]*)'但是它給了我少於 8 的字符串字符也是如此。 需要修改正則表達式以返回包含字母和字母表的 8 個字符的字符串。

您可以使用

\b(?=[a-zA-Z]*[0-9])(?=[0-9]*[a-zA-Z])[a-zA-Z0-9]{8}\b
\b(?=[^\W\d_]*\d)(?=\d*[^\W\d_])[^\W_]{8}\b

第一個只支持 ASCII 字母,而第二個支持所有 Unicode 字母和數字,因為[^\\W\\d_]匹配任何 Unicode 字母, \\d匹配任何 Unicode 數字(因為在 Python 中默認使用re.UNICODE選項3.x)。

細節:

  • \\b - 單詞邊界
  • (?=[a-zA-Z]*[0-9]) - 在任何 0+ ASCII 字母之后,必須有一個數字
  • (?=[0-9]*[a-zA-Z]) - 在任何 0+ 數字之后,必須有一個 ASCII 字母
  • [a-zA-Z0-9]{8} - 八個 ASCII 字母數字字符
  • \\b - 單詞邊界

您可以使用\\b\\w{8}\\b

它不保證您將同時擁有數字和字母,但可以保證您將恰好有八個字符,並被單詞邊界(例如空格、行首/行尾)包圍。

您可以在其中一個在線游樂場中進行嘗試,例如: https : //regex101.com/

在此處輸入圖片說明

匹配的主要內容是用\\w{8} ,這意味着 8 個字母/單詞(包括大寫和下划線)。 \\b表示“詞邊界”

如果您只需要數字和小寫字母,請將其替換為\\b[a-z0-9]{8}\\b

然后,您可以進一步檢查數字和字母是否存在,例如使用filter

list(filter(lambda s: re.search(r'[0-9]', s) and re.search(r'[az]', s), result))

result是你從re.findall()得到的。

所以最重要的是,我會使用:

list(filter(lambda s: re.search(r'[0-9]', s) and re.search(r'[az]', s), re.findall(r'\\b[a-z0-9]{8}\\b', str)))

首先,讓我們找到查找由 8 個字符長的小寫字母和數字組成的單詞的語句:

\b[a-z\d]{8}\b

下一個條件是單詞必須同時包含字母和數字:

[a-d]\d

現在是具有挑戰性的部分,將這些合並為一個語句。 最簡單的方法可能是把它們吐出來,但我們可以使用一些前瞻來讓它工作:

\b(?=.*[a-z]\d)[a-z\d]{8}\b

我確定有一種更整潔的方法可以做到這一點,但這會奏效。

比其他人建議的更緊湊的解決方案是:

((?![A-Za-z]{8}|[0-9]{8})[0-9A-Za-z]{8})

這保證找到的匹配項的長度為 8 個字符,並且它們不能只是數字或字母。

分解:

  • (?![A-Za-z]{8}|[0-9]{8}) = 這是一個負向前瞻,意味着匹配不能是 8 個數字或 8 個字母的字符串。
  • [0-9A-Za-z]{8} = 簡單的正則表達式,表示輸入需要是長度為 8 個字符的字母數字。

測試用例:

輸入: 12345678 abcdefgh i8D0jT5Yu6Ms1GNmrmaUjicc1s9D93aQBj3WWWjww54gkiKqOd7Ytkl0MliJy9xadAgcev8b2UKdfGRDOpxRPm30dw9GeEz3WPRO 1234567890987654321 qwertyuiopasdfghjklzxcvbnm

import re

pattern = re.compile(r'((?![A-Za-z]{8}|\d{8})[A-Za-z\d]{8})')

test = input()
match = pattern.findall(test)
print(match)

輸出: ['i8D0jT5Y', 'u6Ms1GNm', 'maUjicc1', 's9D93aQB', 'j3WWWjww', '54gkiKqO', 'd7Ytkl0M', 'liJy9xad', 'Agcev8b2', 'DOpxRPm3', '0dw9GeEz']

暫無
暫無

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

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