[英]regular expression to met length firstly then check other pattern?
我不知道如何用英文標題准確表達問題,有2條規則
首先,在頭部和末端部分盡可能長地滿足給定的長度
然后匹配其他模式
例如,
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}")
簡單且不言自明:
然后您將能夠以預期的結果重現您的代碼。
對於模式不匹配的情況,將需要一個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.