簡體   English   中英

正則表達式首先滿足長度然后檢查其他模式?

[英]regular expression to met length firstly then check other pattern?

我不知道如何用英文標題准確表達問題,有2條規則

  1. 首先,在頭部和末端部分盡可能長地滿足給定的長度

  2. 然后匹配其他模式

例如,

  1. 必須讀取數字前2~3個字符,如果字符串足夠長,則必須讀取數字后2~4個字符; 如果字符串不夠長,則只讀
  2. 檢查 number 之前的字符是否不是a ,並且 number 之后的字符不是z

--- 編輯於 20220620 ---- 代碼正是下表試圖表達的內容

import re
lst = {
'abc123defg':'abc123defg',
'babc123defg':'abc123defg',
'aba123defg':'""',
'abc123zefg':'""',
'bc123def':'bc123def',
'c123def':'c123def',
'c123zef':'""',
'c123d':'c123d'
}

reStr = r".{1,2}[^a\d]\d+[^z\d].{1,3}"
reStr = r"^[A-Za-z]{1,2}[B-Zb-z]\d+[A-Ya-y][A-Za-z]{1,3}"

for key, value in lst.items():
    match = re.match(reStr, key, re.IGNORECASE | re.VERBOSE)
    if match:
        print(f'{key:15s} expected to be: {value:15s}, really get: {match.group():15s}')
    else:
        print(f'{key:15s} expected to be: {value:15s}, really get: ""')

--- 以下描述是舊的,我現在沒有編輯它

文本 預期的發現 解釋
abc123defg abc123defg 首先閱讀“abc123defg”,其中c不會中斷[^a] ,並且d不會中斷[^z] 所以 'abc123defg' 匹配
babc123defg abc123defg 首先閱讀“abc123defg”,其中c不會中斷[^a] ,並且d不會中斷[^z] 所以 'abc123defg' 匹配
aba123defg 沒有 首先閱讀 'abc123defg',其中a中斷[^a] ,而d不中斷[^z] 所以''匹配
abc123zefg 沒有 首先閱讀“abc123defg”,其中c不會中斷[^a] ,但z會中斷[^z] 所以''匹配
bc123def bc123def 首先閱讀'bc123def',其中c不會中斷[^a] ,並且d不會中斷[^z] 所以 'bc123def' 匹配
c123def c123def 首先閱讀 'c123def',其中c不會中斷[^a] ,並且d不會中斷[^z] 所以'c123def'被匹配
c123zef 沒有 首先閱讀“c123def”,其中c不會中斷[^a] ,而z會中斷[^z] 所以 '' 匹配
c123d c123d 首先閱讀 'c123d',其中c不會中斷[^a] ,並且d不會中斷[^z] 所以 'c123d' 匹配

所以我把正則表達式寫在 Python

import re
lst = ['abc123defg', 'aba123defg', 'abc123zefg', 'bc123def']

for text in lst:
    print(text, ' -> ', re.match(r".{1,2}[^a]\d*[^z].{1,3}", text, re.IGNORECASE | re.VERBOSE).group())

但是,當然,答案不是預期的

abc123defg  ->  abc123defg
aba123defg  ->  aba123
abc123zefg  ->  abc123zef
bc123def  ->  bc123def

那么有沒有辦法只用正則表達式來滿足期望呢? 謝謝

根據您的描述,我將正則表達式更改為:

r".{1,2}[^a\d]\d+[^z\d].{1,3}"

關鍵是要正確匹配數字:

  • 至少一個數字: \d+而不是\d*
  • 為了准確知道數字前后的內容,您只需要通過上面提到的\d+來匹配數字。 這就是為什么我在前后“添加” [^\d]的原因。

這 2 條規則可以包含在單個正則表達式模式中。 試試這個表達式:

regex = re.compile("^[A-Za-z]{1,2}[B-Zb-z]\d+[A-Ya-y][A-Za-z]{1,3}")

簡單且不言自明:

  • 查找 1 到 2 個字母字符
  • 再找一個字母字符,不包括字符 A | 一種
  • 繼續任何數字序列
  • 之后,找到另一個字母字符,不包括字符 Z | z
  • 再找出 1 到 3 個字母字符

然后您將能夠以預期的結果重現您的代碼。

對於模式不匹配的情況,將需要一個try子句以避免 None 相關的 AttributeErrors:

for text in lst:
try:
    print(text, ' -> ', re.match("^[A-Za-z]{1,2}[B-Zb-z]\d+[A-Ya-y][A-Za-z]{1,3}", text).group())
except AttributeError:
    print(text, ' -> No pattern found')

暫無
暫無

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

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